From 208a62cc2b0d672f31b019f3e82cc3f3a7635859 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 28 Mar 2026 00:13:09 +0300 Subject: [PATCH 001/163] Filtred charts template added. --- src/Plugins/Tools/CMakeLists.txt | 1 + src/Plugins/Tools/FltCharts/CMakeLists.txt | 3 + src/Plugins/Tools/FltCharts/FltCharts.qml | 212 +++++++++++++++++ .../Tools/FltCharts/FltChartsButton.qml | 61 +++++ .../Tools/FltCharts/FltChartsPlugin.qml | 39 +++ src/Plugins/Tools/FltCharts/FltChartsView.qml | 223 ++++++++++++++++++ src/Plugins/Tools/FltCharts/README.md | 8 + 7 files changed, 547 insertions(+) create mode 100644 src/Plugins/Tools/FltCharts/CMakeLists.txt create mode 100644 src/Plugins/Tools/FltCharts/FltCharts.qml create mode 100644 src/Plugins/Tools/FltCharts/FltChartsButton.qml create mode 100755 src/Plugins/Tools/FltCharts/FltChartsPlugin.qml create mode 100644 src/Plugins/Tools/FltCharts/FltChartsView.qml create mode 100644 src/Plugins/Tools/FltCharts/README.md diff --git a/src/Plugins/Tools/CMakeLists.txt b/src/Plugins/Tools/CMakeLists.txt index 78c104a11..918f9f139 100644 --- a/src/Plugins/Tools/CMakeLists.txt +++ b/src/Plugins/Tools/CMakeLists.txt @@ -1,5 +1,6 @@ add_subdirectory("DatalinkInspector") add_subdirectory("VcpForwarding") +add_subdirectory("FltCharts") add_subdirectory("Signals") add_subdirectory("Ats") add_subdirectory("Swarm") diff --git a/src/Plugins/Tools/FltCharts/CMakeLists.txt b/src/Plugins/Tools/FltCharts/CMakeLists.txt new file mode 100644 index 000000000..8328020ed --- /dev/null +++ b/src/Plugins/Tools/FltCharts/CMakeLists.txt @@ -0,0 +1,3 @@ +apx_plugin(SRCS "*.qml") + +apx_qrc(${MODULE} PREFIX ${MODULE} SRCS "*.qml") diff --git a/src/Plugins/Tools/FltCharts/FltCharts.qml b/src/Plugins/Tools/FltCharts/FltCharts.qml new file mode 100644 index 000000000..e69524479 --- /dev/null +++ b/src/Plugins/Tools/FltCharts/FltCharts.qml @@ -0,0 +1,212 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import QtQuick.Controls.Material +import QtCore + +import Apx.Common + +Rectangle { + id: control + + implicitHeight: layout.implicitHeight + implicitWidth: layout.implicitWidth + + border.width: 0 + color: "#000" + + ColumnLayout { + id: layout + anchors.fill: parent + spacing: 0 + + FltChartsView { + id: signals + facts: [] + Layout.fillWidth: true + Layout.fillHeight: true + Layout.minimumHeight: 20 + Layout.preferredHeight: 130 * ui.scale + } + + TextInput { + id: textInput + + Layout.fillWidth: true + Layout.minimumHeight: Style.fontSize + + // clip: true + // focus: true + visible: false + + horizontalAlignment: Text.AlignRight + verticalAlignment: Text.AlignVCenter + + font: apx.font_narrow(Style.fontSize) + + color: activeFocus ? Material.color(Material.Yellow) : Material.primaryTextColor + text: " " + + activeFocusOnTab: true + selectByMouse: true + + onEditingFinished: { + var activeButton = buttonGroup.checkedButton; + if (activeButton) + activeButton.toolTip = textInput.text; + // updateFacts(); + } + onActiveFocusChanged: { + if (activeFocus) + selectAll(); + } + onVisibleChanged: if (visible) + forceActiveFocus() + + // Component.onCompleted: updateFacts() + + // property var facts: [] + // function updateFacts() { + // var flist = []; + // var list = textInput.text.split(','); + // for (var i = 0; i < list.length; ++i) { + // var f = list[i]; + // var fact = {}; + // if (eval(f) == undefined) + // continue; + // fact.title = f; + // fact.name = f; + // fact.descr = f; + // fact.opts = {}; + // fact.opts.color = Material.color(Material.Blue + i * 2); + // flist.push(fact); + // } + // if (JSON.stringify(textInput.facts) == JSON.stringify(flist)) + // return; + // textInput.facts = flist; + + // if (plusButton.checked) + // signals.facts = flist; + // } + } + + ButtonGroup { + id: buttonGroup + // buttons: bottomArea.buttons + } + + RowLayout { + id: bottomArea + Layout.fillWidth: true + Layout.margins: Style.spacing + spacing: 3 + Layout.maximumHeight: 24 * ui.scale + FltChartsButton { + text: "1" + checked: true + values: [mandala.cmd.att.roll, mandala.est.att.roll] + } + FltChartsButton { + text: "2" + values: [mandala.cmd.att.pitch, mandala.est.att.pitch] + } + FltChartsButton { + text: "3" + values: [mandala.cmd.pos.bearing, mandala.cmd.att.yaw, mandala.est.att.yaw] + } + FltChartsButton { + text: "4" + values: [mandala.est.acc.x, mandala.est.acc.y] + } + FltChartsButton { + text: "5" + values: [mandala.est.acc.z] + } + FltChartsButton { + text: "6" + values: [mandala.est.gyro.x, mandala.est.gyro.y, mandala.est.gyro.z] + } + FltChartsButton { + text: "7" + values: [mandala.est.pos.altitude, mandala.est.pos.vspeed, mandala.est.air.airspeed] + } + FltChartsButton { + text: "8" + values: [mandala.ctr.att.ail, mandala.ctr.att.elv, mandala.ctr.att.rud, mandala.ctr.eng.thr, mandala.ctr.eng.prop, mandala.ctr.str.rud] + } + FltChartsButton { + text: "9" + values: [mandala.cmd.rc.roll, mandala.cmd.rc.pitch, mandala.cmd.rc.thr, mandala.cmd.rc.yaw] + } + FltChartsButton { + text: "10" + values: [mandala.est.usr.u1, mandala.est.usr.u2, mandala.est.usr.u3, mandala.est.usr.u4, mandala.est.usr.u5, mandala.est.usr.u6] + } + + FltChartsButton { + id: plusButton + text: "+" + values: textInput.facts + } + + TextButton { + text: signals.speedFactorValue + "x" + onClicked: signals.changeSpeed() + Layout.fillHeight: true + Layout.minimumWidth: height * 3 + } + } + } + + IconButton { + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: Style.spacing + size: Style.buttonSize * 0.7 + iconName: "plus" + toolTip: qsTr("Edit charts") + opacity: ui.effects ? (hovered ? 1 : 0.5) : 1 + onTriggered: console.log("Not implemented") + } + + property string currentPage: buttonGroup.checkedButton.text + + Settings { + category: "signals" + property alias page: control.currentPage + property alias custom: textInput.text + } + Component.onCompleted: { + for (var i = 0; i < buttonGroup.buttons.length; ++i) { + var b = buttonGroup.buttons[i]; + if (b.text !== control.currentPage) + continue; + buttonGroup.checkedButton = b; + break; + } + if (buttonGroup.checkedButton == null) { + buttonGroup.checkedButton = buttonGroup.buttons[0]; //showPage("R") + } + } +} diff --git a/src/Plugins/Tools/FltCharts/FltChartsButton.qml b/src/Plugins/Tools/FltCharts/FltChartsButton.qml new file mode 100644 index 000000000..ab5a85b83 --- /dev/null +++ b/src/Plugins/Tools/FltCharts/FltChartsButton.qml @@ -0,0 +1,61 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import Apx.Common + +TextButton { + id: btn + + Layout.fillHeight: true + checkable: true + ButtonGroup.group: buttonGroup + textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor + // toolTip: getToolTip(values) + + onCheckedChanged: { + if (!checked) + textInput.visible = false; + } + onPressed: { + if (checked) + textInput.visible = !textInput.visible; + } + + property var values: [] + // onActivated: signals.facts = Qt.binding(function () { + // return values; + // }) + + // toolTip: getToolTip(values) + + // function getToolTip(facts) { + // var s = []; + // for (var i = 0; i < facts.length; ++i) { + // var fact = facts[i]; + // s.push("" + fact.descr + ""); + // } + // return s.join("
"); + // } +} diff --git a/src/Plugins/Tools/FltCharts/FltChartsPlugin.qml b/src/Plugins/Tools/FltCharts/FltChartsPlugin.qml new file mode 100755 index 000000000..cac90f801 --- /dev/null +++ b/src/Plugins/Tools/FltCharts/FltChartsPlugin.qml @@ -0,0 +1,39 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick + +import Apx.Common +import Apx.Application + +AppPlugin { + id: plugin + + title: qsTr("Filtred Charts") + descr: qsTr("Realtime filtred chart") + icon: "poll-box-outline" + + sourceComponent: FltCharts {} + uiComponent: "main" + onConfigure: { + ui.main.add(plugin, GroundControl.Layout.Main); + } +} diff --git a/src/Plugins/Tools/FltCharts/FltChartsView.qml b/src/Plugins/Tools/FltCharts/FltChartsView.qml new file mode 100644 index 000000000..eb9c0855d --- /dev/null +++ b/src/Plugins/Tools/FltCharts/FltChartsView.qml @@ -0,0 +1,223 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick +import QtCharts +import QtQuick.Controls +import QtQml + +Item { + id: chartItem + //clip: true + property var facts: [] + + property bool openGL: false //apx.settings.graphics.opengl.value + property bool smoothLines: ui.smooth + + property real speed: 0 + property real lineWidth: ui.antialiasing ? 1.5 : 1 + property real lineWidthCmd: ui.antialiasing ? 2.1 : 2 + + property var speedFactor: [1, 2, 4, 0.5, 0.2] + property real speedFactorValue: speed < 0 ? speedFactor[0] : speed >= speedFactor.length ? speedFactor[speedFactor.length - 1] : speedFactor[speed] + + onFactsChanged: { + chartView.reset(); + } + + Connections { + target: apx.fleet.current.mandala + function onTelemetryDecoded() { + chartView.appendData(); + } + } + + ChartView { + id: chartView + + antialiasing: ui.antialiasing + legend.visible: false + margins.top: 0 + margins.left: 0 + margins.bottom: 0 + margins.right: 0 + + anchors.fill: parent + property int margin: -8 + anchors.topMargin: margin + anchors.bottomMargin: margin + anchors.leftMargin: margin + anchors.rightMargin: margin + //onPlotAreaChanged: margin=-plotArea.y/3 + + plotAreaColor: "black" + backgroundColor: "black" + backgroundRoundness: 0 + dropShadowEnabled: false + + property int samples: Math.min(1000, Math.max(25, width / (3 * speedFactorValue))) + property int time: 0 + + property bool dataExist: false + + ValueAxis { + id: axisX + property real t: chartView.time + Behavior on t { + enabled: ui.smooth && chartView.dataExist + NumberAnimation { + duration: 500 + } + } + min: t - chartView.samples + 20 + max: t + //min: -chartView.samples //t-chartView.samples+20 + //max: 0 //t + visible: false + gridVisible: false + labelsVisible: false + lineVisible: false + shadesVisible: false + titleVisible: false + } + ValueAxis { + id: axisY + min: -0 + max: 0 + tickCount: 4 + labelsColor: "white" + labelsFont.pixelSize: Qt.application.font.pixelSize * 0.7 + gridLineColor: "#555" + } + + property real dataPadding: 0.05 + property real dataPaddingZero: 0.05 + property var sdata: [] + property int timeRescale: 0 + + function reset() { + chartView.removeAllSeries(); + chartView.sdata = []; + chartView.time = 0; + axisY.min = -dataPaddingZero; + axisY.max = dataPaddingZero; + axisY.tickCount = 4; + axisY.applyNiceNumbers(); + speed = 0; + } + + function appendData() { + var t = time + 1; + var v = 0; + var fact = {}; + for (var i = 0; i < facts.length; ++i) { + appendDataValue(facts[i], t, i); + } + //calc scale - reduce + if ((t - timeRescale) > 21) { + timeRescale = t; + var d = sdata.length - samples * facts.length; + if (d > 0) + sdata.splice(0, d); + var p = apx.seriesBounds(sdata); + var min = p.x - dataPadding; + var max = p.y + dataPadding; + if (min == max) { + min -= dataPaddingZero; + max += dataPaddingZero; + } + var bmod = false; + if (axisY.min < min) { + axisY.min = min; + bmod = true; + } + if (axisY.max > max) { + axisY.max = max; + bmod = true; + } + if (bmod) { + axisY.tickCount = 4; + axisY.applyNiceNumbers(); + } + } + time = t; + dataExist = true; + } + + function appendDataValue(fact, t, i) { + if (i >= chartView.count) + addFactSeries(fact); + var s = chartView.series(i); + + var value = fact.value != undefined ? fact.value : eval(fact.name); + + if (!isFinite(value)) + value = 0; + s.append(t, value); + sdata.push(value); + //instant rescale - grow + if (axisY.max < value) { + axisY.max = value + dataPadding; + } + if (axisY.min > value) { + axisY.min = value - dataPadding; + } + //remove old + var cnt = samples; + if (s.count > cnt) + s.removePoints(0, s.count - cnt); + } + + function addFactSeries(fact) { + var s = chartView.createSeries(ui.antialiasing ? ChartView.SeriesTypeLine : ChartView.SeriesTypeLine, fact.title, axisX, axisY); + s.useOpenGL = Qt.binding(function () { + return openGL; + }); + s.capStyle = Qt.RoundCap; + //s.opacity=0.7 + + var color = fact.opts.color; + if (!color) + color = Qt.rgba(1, 1, 1, 1); + + if (fact.name.startsWith("cmd")) { + s.width = Qt.binding(function () { + return lineWidthCmd; + }); + s.color = Qt.hsla(color.hslHue, color.hslSaturation / 2, color.hslLightness * 1.2, 1); + } else { + s.width = Qt.binding(function () { + return lineWidth; + }); + s.color = color; + } + return s; + } + } + + function changeSpeed() { + if ((speed + 1) < speedFactor.length) + speed++; + else + speed = 0; + //console.log(speed) + } +} diff --git a/src/Plugins/Tools/FltCharts/README.md b/src/Plugins/Tools/FltCharts/README.md new file mode 100644 index 000000000..4c7dbab2a --- /dev/null +++ b/src/Plugins/Tools/FltCharts/README.md @@ -0,0 +1,8 @@ +--- +page: plugins +--- + +# Fltred Charts + +QML widget to show live chart of selected UAV physical values with filtering. + \ No newline at end of file From 289ba2208706a57ba16ac5e049d126f710d07a37 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 28 Mar 2026 00:13:59 +0300 Subject: [PATCH 002/163] App pligins missing description fix. --- src/lib/ApxCore/App/AppRoot.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/ApxCore/App/AppRoot.cpp b/src/lib/ApxCore/App/AppRoot.cpp index ba04b8c59..b37c34430 100644 --- a/src/lib/ApxCore/App/AppRoot.cpp +++ b/src/lib/ApxCore/App/AppRoot.cpp @@ -65,7 +65,7 @@ void AppRoot::createTools() f_pluginsSettings = new Fact(f_settings->f_application, "plugins", tr("Plugins"), - tr("Application PligIns"), + tr("Application Plugins"), Group); App::jsync(f_settings); } From 0a6113def2e5d93a361a1e7ce5e83fe734107da0 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 29 Mar 2026 12:42:37 +0300 Subject: [PATCH 003/163] FilteredCharts refactoring. --- src/Plugins/Tools/CMakeLists.txt | 2 +- .../CMakeLists.txt | 0 .../FilteredCharts.qml} | 73 +++++++++---------- .../FilteredChartsPlugin.qml} | 2 +- .../FltChartsButton.qml | 26 +++---- .../FltChartsView.qml | 28 +++---- .../{FltCharts => FilteredCharts}/README.md | 2 +- 7 files changed, 64 insertions(+), 69 deletions(-) rename src/Plugins/Tools/{FltCharts => FilteredCharts}/CMakeLists.txt (100%) rename src/Plugins/Tools/{FltCharts/FltCharts.qml => FilteredCharts/FilteredCharts.qml} (79%) rename src/Plugins/Tools/{FltCharts/FltChartsPlugin.qml => FilteredCharts/FilteredChartsPlugin.qml} (96%) rename src/Plugins/Tools/{FltCharts => FilteredCharts}/FltChartsButton.qml (75%) rename src/Plugins/Tools/{FltCharts => FilteredCharts}/FltChartsView.qml (90%) rename src/Plugins/Tools/{FltCharts => FilteredCharts}/README.md (85%) diff --git a/src/Plugins/Tools/CMakeLists.txt b/src/Plugins/Tools/CMakeLists.txt index 918f9f139..967daa7e1 100644 --- a/src/Plugins/Tools/CMakeLists.txt +++ b/src/Plugins/Tools/CMakeLists.txt @@ -1,6 +1,6 @@ add_subdirectory("DatalinkInspector") add_subdirectory("VcpForwarding") -add_subdirectory("FltCharts") +add_subdirectory("FilteredCharts") add_subdirectory("Signals") add_subdirectory("Ats") add_subdirectory("Swarm") diff --git a/src/Plugins/Tools/FltCharts/CMakeLists.txt b/src/Plugins/Tools/FilteredCharts/CMakeLists.txt similarity index 100% rename from src/Plugins/Tools/FltCharts/CMakeLists.txt rename to src/Plugins/Tools/FilteredCharts/CMakeLists.txt diff --git a/src/Plugins/Tools/FltCharts/FltCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml similarity index 79% rename from src/Plugins/Tools/FltCharts/FltCharts.qml rename to src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index e69524479..462f807e5 100644 --- a/src/Plugins/Tools/FltCharts/FltCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -28,7 +28,7 @@ import QtCore import Apx.Common Rectangle { - id: control + id: fcControl implicitHeight: layout.implicitHeight implicitWidth: layout.implicitWidth @@ -42,7 +42,7 @@ Rectangle { spacing: 0 FltChartsView { - id: signals + id: fltCharts facts: [] Layout.fillWidth: true Layout.fillHeight: true @@ -55,6 +55,7 @@ Rectangle { Layout.fillWidth: true Layout.minimumHeight: Style.fontSize + Layout.rightMargin: Style.spacing // clip: true // focus: true @@ -66,7 +67,7 @@ Rectangle { font: apx.font_narrow(Style.fontSize) color: activeFocus ? Material.color(Material.Yellow) : Material.primaryTextColor - text: " " + text: "_" activeFocusOnTab: true selectByMouse: true @@ -84,31 +85,31 @@ Rectangle { onVisibleChanged: if (visible) forceActiveFocus() - // Component.onCompleted: updateFacts() - - // property var facts: [] - // function updateFacts() { - // var flist = []; - // var list = textInput.text.split(','); - // for (var i = 0; i < list.length; ++i) { - // var f = list[i]; - // var fact = {}; - // if (eval(f) == undefined) - // continue; - // fact.title = f; - // fact.name = f; - // fact.descr = f; - // fact.opts = {}; - // fact.opts.color = Material.color(Material.Blue + i * 2); - // flist.push(fact); - // } - // if (JSON.stringify(textInput.facts) == JSON.stringify(flist)) - // return; - // textInput.facts = flist; - - // if (plusButton.checked) - // signals.facts = flist; - // } + Component.onCompleted: updateFacts() + + property var facts: [] + function updateFacts() { + var flist = []; + var list = textInput.text.split(','); + for (var i = 0; i < list.length; ++i) { + var f = list[i]; + var fact = {}; + if (eval(f) == undefined) + continue; + fact.title = f; + fact.name = f; + fact.descr = f; + fact.opts = {}; + fact.opts.color = Material.color(Material.Blue + i * 2); + flist.push(fact); + } + if (JSON.stringify(textInput.facts) == JSON.stringify(flist)) + return; + textInput.facts = flist; + + if (plusButton.checked) + fltCharts.facts = flist; + } } ButtonGroup { @@ -164,15 +165,9 @@ Rectangle { values: [mandala.est.usr.u1, mandala.est.usr.u2, mandala.est.usr.u3, mandala.est.usr.u4, mandala.est.usr.u5, mandala.est.usr.u6] } - FltChartsButton { - id: plusButton - text: "+" - values: textInput.facts - } - TextButton { - text: signals.speedFactorValue + "x" - onClicked: signals.changeSpeed() + text: fltCharts.speedFactorValue + "x" + onClicked: fltCharts.changeSpeed() Layout.fillHeight: true Layout.minimumWidth: height * 3 } @@ -193,14 +188,14 @@ Rectangle { property string currentPage: buttonGroup.checkedButton.text Settings { - category: "signals" - property alias page: control.currentPage + category: "filtredCharts" + property alias page: fcControl.currentPage property alias custom: textInput.text } Component.onCompleted: { for (var i = 0; i < buttonGroup.buttons.length; ++i) { var b = buttonGroup.buttons[i]; - if (b.text !== control.currentPage) + if (b.text !== fcontrol.currentPage) continue; buttonGroup.checkedButton = b; break; diff --git a/src/Plugins/Tools/FltCharts/FltChartsPlugin.qml b/src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml similarity index 96% rename from src/Plugins/Tools/FltCharts/FltChartsPlugin.qml rename to src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml index cac90f801..2c7eb34c4 100755 --- a/src/Plugins/Tools/FltCharts/FltChartsPlugin.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml @@ -31,7 +31,7 @@ AppPlugin { descr: qsTr("Realtime filtred chart") icon: "poll-box-outline" - sourceComponent: FltCharts {} + sourceComponent: FilteredCharts {} uiComponent: "main" onConfigure: { ui.main.add(plugin, GroundControl.Layout.Main); diff --git a/src/Plugins/Tools/FltCharts/FltChartsButton.qml b/src/Plugins/Tools/FilteredCharts/FltChartsButton.qml similarity index 75% rename from src/Plugins/Tools/FltCharts/FltChartsButton.qml rename to src/Plugins/Tools/FilteredCharts/FltChartsButton.qml index ab5a85b83..937c55189 100644 --- a/src/Plugins/Tools/FltCharts/FltChartsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FltChartsButton.qml @@ -26,7 +26,7 @@ import QtQuick.Layouts import Apx.Common TextButton { - id: btn + id: fltBtn Layout.fillHeight: true checkable: true @@ -44,18 +44,18 @@ TextButton { } property var values: [] - // onActivated: signals.facts = Qt.binding(function () { - // return values; - // }) + onActivated: fltCharts.facts = Qt.binding(function () { + return values; + }) - // toolTip: getToolTip(values) + toolTip: getToolTip(values) - // function getToolTip(facts) { - // var s = []; - // for (var i = 0; i < facts.length; ++i) { - // var fact = facts[i]; - // s.push("" + fact.descr + ""); - // } - // return s.join("
"); - // } + function getToolTip(facts) { + var s = []; + for (var i = 0; i < facts.length; ++i) { + var fact = facts[i]; + s.push("" + fact.descr + ""); + } + return s.join("
"); + } } diff --git a/src/Plugins/Tools/FltCharts/FltChartsView.qml b/src/Plugins/Tools/FilteredCharts/FltChartsView.qml similarity index 90% rename from src/Plugins/Tools/FltCharts/FltChartsView.qml rename to src/Plugins/Tools/FilteredCharts/FltChartsView.qml index eb9c0855d..786a728ff 100644 --- a/src/Plugins/Tools/FltCharts/FltChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FltChartsView.qml @@ -25,7 +25,7 @@ import QtQuick.Controls import QtQml Item { - id: chartItem + id: fltChartItem //clip: true property var facts: [] @@ -40,18 +40,18 @@ Item { property real speedFactorValue: speed < 0 ? speedFactor[0] : speed >= speedFactor.length ? speedFactor[speedFactor.length - 1] : speedFactor[speed] onFactsChanged: { - chartView.reset(); + fltChartView.reset(); } Connections { target: apx.fleet.current.mandala function onTelemetryDecoded() { - chartView.appendData(); + fltChartView.appendData(); } } ChartView { - id: chartView + id: fltChartView antialiasing: ui.antialiasing legend.visible: false @@ -80,16 +80,16 @@ Item { ValueAxis { id: axisX - property real t: chartView.time + property real t: fltChartView.time Behavior on t { - enabled: ui.smooth && chartView.dataExist + enabled: ui.smooth && fltChartView.dataExist NumberAnimation { duration: 500 } } - min: t - chartView.samples + 20 + min: t - fltChartView.samples + 20 max: t - //min: -chartView.samples //t-chartView.samples+20 + //min: - fltChartView.samples //t- fltChartView.samples+20 //max: 0 //t visible: false gridVisible: false @@ -114,9 +114,9 @@ Item { property int timeRescale: 0 function reset() { - chartView.removeAllSeries(); - chartView.sdata = []; - chartView.time = 0; + fltChartView.removeAllSeries(); + fltChartView.sdata = []; + fltChartView.time = 0; axisY.min = -dataPaddingZero; axisY.max = dataPaddingZero; axisY.tickCount = 4; @@ -163,9 +163,9 @@ Item { } function appendDataValue(fact, t, i) { - if (i >= chartView.count) + if (i >= fltChartView.count) addFactSeries(fact); - var s = chartView.series(i); + var s = fltChartView.series(i); var value = fact.value != undefined ? fact.value : eval(fact.name); @@ -187,7 +187,7 @@ Item { } function addFactSeries(fact) { - var s = chartView.createSeries(ui.antialiasing ? ChartView.SeriesTypeLine : ChartView.SeriesTypeLine, fact.title, axisX, axisY); + var s = fltChartView.createSeries(ui.antialiasing ? ChartView.SeriesTypeLine : ChartView.SeriesTypeLine, fact.title, axisX, axisY); s.useOpenGL = Qt.binding(function () { return openGL; }); diff --git a/src/Plugins/Tools/FltCharts/README.md b/src/Plugins/Tools/FilteredCharts/README.md similarity index 85% rename from src/Plugins/Tools/FltCharts/README.md rename to src/Plugins/Tools/FilteredCharts/README.md index 4c7dbab2a..91183c8a0 100644 --- a/src/Plugins/Tools/FltCharts/README.md +++ b/src/Plugins/Tools/FilteredCharts/README.md @@ -2,7 +2,7 @@ page: plugins --- -# Fltred Charts +# Filtered Charts QML widget to show live chart of selected UAV physical values with filtering. \ No newline at end of file From 4659b95296fc9bee72c95f471f4122f76bdf7f22 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 29 Mar 2026 18:29:42 +0300 Subject: [PATCH 004/163] Add charts settings template. --- .../Tools/FilteredCharts/FilteredCharts.qml | 10 +- .../Tools/FilteredCharts/FltChartsButton.qml | 8 + .../FilteredCharts/FltChartsMenuChart.qml | 173 +++++++++++++++++ .../Tools/FilteredCharts/FltChartsMenuSet.qml | 148 +++++++++++++++ .../Tools/FilteredCharts/FltChartsView.qml | 7 +- src/Plugins/Tools/Signals/SignalsView.qml | 179 ++++++++++-------- 6 files changed, 433 insertions(+), 92 deletions(-) create mode 100644 src/Plugins/Tools/FilteredCharts/FltChartsMenuChart.qml create mode 100644 src/Plugins/Tools/FilteredCharts/FltChartsMenuSet.qml diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 462f807e5..3ab784daa 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -28,7 +28,7 @@ import QtCore import Apx.Common Rectangle { - id: fcControl + id: fltControl implicitHeight: layout.implicitHeight implicitWidth: layout.implicitWidth @@ -67,7 +67,7 @@ Rectangle { font: apx.font_narrow(Style.fontSize) color: activeFocus ? Material.color(Material.Yellow) : Material.primaryTextColor - text: "_" + text: "" activeFocusOnTab: true selectByMouse: true @@ -167,7 +167,7 @@ Rectangle { TextButton { text: fltCharts.speedFactorValue + "x" - onClicked: fltCharts.changeSpeed() + // onClicked: fltCharts.changeSpeed() Layout.fillHeight: true Layout.minimumWidth: height * 3 } @@ -189,13 +189,13 @@ Rectangle { Settings { category: "filtredCharts" - property alias page: fcControl.currentPage + property alias page: fltControl.currentPage property alias custom: textInput.text } Component.onCompleted: { for (var i = 0; i < buttonGroup.buttons.length; ++i) { var b = buttonGroup.buttons[i]; - if (b.text !== fcontrol.currentPage) + if (b.text !== fltControl.currentPage) continue; buttonGroup.checkedButton = b; break; diff --git a/src/Plugins/Tools/FilteredCharts/FltChartsButton.qml b/src/Plugins/Tools/FilteredCharts/FltChartsButton.qml index 937c55189..69ba5308c 100644 --- a/src/Plugins/Tools/FilteredCharts/FltChartsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FltChartsButton.qml @@ -41,6 +41,10 @@ TextButton { onPressed: { if (checked) textInput.visible = !textInput.visible; + if (checked) + if (!fltMenuSet.active) { + fltMenuSet.trigger(); + } else {} } property var values: [] @@ -58,4 +62,8 @@ TextButton { } return s.join("
"); } + + FltChartsMenuSet { + id: fltMenuSet + } } diff --git a/src/Plugins/Tools/FilteredCharts/FltChartsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FltChartsMenuChart.qml new file mode 100644 index 000000000..678d3f78e --- /dev/null +++ b/src/Plugins/Tools/FilteredCharts/FltChartsMenuChart.qml @@ -0,0 +1,173 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick + +import APX.Facts + +Fact { + id: number + flags: Fact.Group + + property bool newItem: false + + property var data: ({}) + + signal addTriggered + signal removeTriggered + + Component.onCompleted: { + load(data); + // updateTitle(); + // updateDescr(); + // mTitle.valueChanged.connect(updateTitle); + } + + function load() { + for (var i = 0; i < size; ++i) { + var f = child(i); + var v = data[settingName(f)]; + f.value = v; + } + } + + function save() { + data = {}; + for (var i = 0; i < size; ++i) { + var f = child(i); + var s = f.text.trim(); + if (s === "") + continue; + data[settingName(f)] = s; + } + return data; + } + + function settingName(f) { + var n = f.name; + if (n.includes("_")) + return n.slice(0, n.indexOf("_")); + return n; + } + + function updateTitle() { + if (newItem) + return; + title = mTitle.text ? mTitle.text : mBind.text; + } + + function updateDescr() { + //list non-zero values in descr + var descrList = []; + for (var i = 0; i < size; ++i) { + var f = child(i); + if (!f.name) + continue; + if (f.name === "title") + continue; + if (f.name === "color") + continue; + if (f.text === "") + continue; + descrList.push(f.name.toUpperCase() + ": " + f.text); + } + if (descrList.length > 0) + descr = descrList.join(", "); + else + descr = ""; + } + + // Fact { + // id: mFact + // title: qsTr("Binding") + // descr: qsTr("Fact value") + // flags: Fact.Int + // units: "mandala" + // onTextChanged: { + // if(value){ + // mBind.setValue(text) + // } + // //value=null + // } + // } + Fact { + id: mBind + name: "bind_num" + title: qsTr("Expression") + descr: "Math.atan(est.att.pitch/est.att.roll)" + flags: Fact.Text + // onValueChanged: updateDescr() + } + Fact { + id: mColor + name: "color_num" + title: qsTr("Color") + descr: qsTr("Chart color") + flags: Fact.Enum + enumStrings: ["red", "orange", "yelow", "green", "aqua", "blue", "purple", "pink"] + // onValueChanged: updateDescr() + } + Fact { + name: "warn" + title: qsTr("Warning") + descr: qsTr("Expression for warning") + flags: Fact.Text + enabled: false + // onValueChanged: updateDescr() + } + Fact { + name: "alarm" + title: qsTr("Alarm") + descr: "value>1.8 || (value>0 && value<1)" + flags: Fact.Text + enabled: false + // onValueChanged: updateDescr() + } + Fact { + name: "act" + title: qsTr("Action") + descr: "cmd.proc.action=proc_action_reset" + flags: Fact.Text + enabled: false + // onValueChanged: updateDescr() + } + //actions + Fact { + flags: (Fact.Action | Fact.Apply) + title: qsTr("Add") + enabled: (newItem && mBind && mBind.value) ? true : false + icon: "plus-circle" + onTriggered: { + number.menuBack(); + addTriggered(); + } + } + Fact { + flags: (Fact.Action | Fact.Remove) + title: qsTr("Remove") + visible: !newItem + icon: "delete" + onTriggered: { + removeTriggered(); + number.deleteFact(); + } + } +} diff --git a/src/Plugins/Tools/FilteredCharts/FltChartsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FltChartsMenuSet.qml new file mode 100644 index 000000000..4f6d222cc --- /dev/null +++ b/src/Plugins/Tools/FilteredCharts/FltChartsMenuSet.qml @@ -0,0 +1,148 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick + +import APX.Facts + +Fact { + id: setFact + flags: (Fact.Group | Fact.FlatModel) + title: "Charts #" + fltBtn.text + + property var values //from config + + signal selected(var num) + + property int editorsCnt: 1 + Fact { + id: setTitle + title: qsTr("Title") + descr: qsTr("Charts title") + flags: Fact.Text + icon: "rename-box" + value: setFact.title + onValueChanged: { + fltBtn.toolTip = value; + } + } + + Fact { + id: setSpeed + title: qsTr("Speed") + descr: qsTr("Charts speed") + flags: Fact.Float + icon: "speedometer" + value: 1.0 + precision: 1 + min: 0.1 + max: 5 + onValueChanged: { + speed = value; + console.log("Speed =", value); + } + } + + FltChartsMenuChart { + title: qsTr("Add new chart") + descr: "Creating and setting a new chart" + icon: "plus-circle" + newItem: true + onAddTriggered: createNumber(save()) + } + + Fact { + id: setValues + title: qsTr("Values") + flags: (Fact.Group | Fact.Section | Fact.DragChildren) + } + + Component.onCompleted: updateSetItems() + + function save() { + var values = []; + for (var i = 0; i < setValues.size; ++i) { + var number = setValues.child(i).save(); + if (!number.bind) + continue; + values.push(number); + } + if (!values) + return; + var set = {}; + set.title = title; + set.values = values; + return set; + } + + function updateSetItems() { + setValues.onSizeChanged.disconnect(updateDescr); + setValues.deleteChildren(); + for (var i in values) { + createNumber(values[i]); + } + updateDescr(); + setValues.onSizeChanged.connect(updateDescr); + } + function createNumber(number) { + if (!number.bind) + return; + if (number.bind === "") + return; + var c = createFact(setValues, "FltChartsMenuChart.qml", { + "data": number + }); + c.titleChanged.connect(updateDescr); + c.removeTriggered.connect(updateDescr); + } + function updateDescr() { + if (!setFact) + return; + descr = ""; + var s = []; + for (var i = 0; i < setValues.size; ++i) { + s.push(setValues.child(i).title); + } + descr = s.join(','); + } + + // Fact { + // flags: (Fact.Action | Fact.Remove) + // title: qsTr("Remove set") + // icon: "delete" + // onTriggered: { + // if (setFact.active) + // select(0); + // setFact.destroy(); + // } + // } + + Fact { + flags: (Fact.Action | Fact.Apply) + title: qsTr("Select and save") + visible: !setFact.active + icon: "check-circle" + onTriggered: { + setFact.menuBack(); + setFact.selected(setFact.num); + } + } +} diff --git a/src/Plugins/Tools/FilteredCharts/FltChartsView.qml b/src/Plugins/Tools/FilteredCharts/FltChartsView.qml index 786a728ff..9482afaca 100644 --- a/src/Plugins/Tools/FilteredCharts/FltChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FltChartsView.qml @@ -36,8 +36,9 @@ Item { property real lineWidth: ui.antialiasing ? 1.5 : 1 property real lineWidthCmd: ui.antialiasing ? 2.1 : 2 - property var speedFactor: [1, 2, 4, 0.5, 0.2] - property real speedFactorValue: speed < 0 ? speedFactor[0] : speed >= speedFactor.length ? speedFactor[speedFactor.length - 1] : speedFactor[speed] + // property var speedFactor: [1, 2, 4, 0.5, 0.2] + // property real speedFactorValue: speed < 0 ? speedFactor[0] : speed >= speedFactor.length ? speedFactor[speedFactor.length - 1] : speedFactor[speed] + property real speedFactorValue: 1 onFactsChanged: { fltChartView.reset(); @@ -215,7 +216,7 @@ Item { function changeSpeed() { if ((speed + 1) < speedFactor.length) - speed++; + speed += 1; else speed = 0; //console.log(speed) diff --git a/src/Plugins/Tools/Signals/SignalsView.qml b/src/Plugins/Tools/Signals/SignalsView.qml index b1b5bd04a..eb9c0855d 100644 --- a/src/Plugins/Tools/Signals/SignalsView.qml +++ b/src/Plugins/Tools/Signals/SignalsView.qml @@ -32,21 +32,22 @@ Item { property bool openGL: false //apx.settings.graphics.opengl.value property bool smoothLines: ui.smooth - property real speed: 0 - property real lineWidth: ui.antialiasing?1.5:1 - property real lineWidthCmd: ui.antialiasing?2.1:2 + property real lineWidth: ui.antialiasing ? 1.5 : 1 + property real lineWidthCmd: ui.antialiasing ? 2.1 : 2 - property var speedFactor: [ 1, 2, 4, 0.5, 0.2 ] - property real speedFactorValue: speed<0?speedFactor[0]:speed>=speedFactor.length?speedFactor[speedFactor.length-1]:speedFactor[speed] + property var speedFactor: [1, 2, 4, 0.5, 0.2] + property real speedFactorValue: speed < 0 ? speedFactor[0] : speed >= speedFactor.length ? speedFactor[speedFactor.length - 1] : speedFactor[speed] onFactsChanged: { - chartView.reset() + chartView.reset(); } Connections { target: apx.fleet.current.mandala - function onTelemetryDecoded(){ chartView.appendData() } + function onTelemetryDecoded() { + chartView.appendData(); + } } ChartView { @@ -72,7 +73,7 @@ Item { backgroundRoundness: 0 dropShadowEnabled: false - property int samples: Math.min(1000,Math.max(25,width/(3*speedFactorValue))) + property int samples: Math.min(1000, Math.max(25, width / (3 * speedFactorValue))) property int time: 0 property bool dataExist: false @@ -80,8 +81,13 @@ Item { ValueAxis { id: axisX property real t: chartView.time - Behavior on t { enabled: ui.smooth && chartView.dataExist; NumberAnimation {duration: 500; } } - min: t-chartView.samples+20 + Behavior on t { + enabled: ui.smooth && chartView.dataExist + NumberAnimation { + duration: 500 + } + } + min: t - chartView.samples + 20 max: t //min: -chartView.samples //t-chartView.samples+20 //max: 0 //t @@ -102,111 +108,116 @@ Item { gridLineColor: "#555" } - property real dataPadding: 0.05 property real dataPaddingZero: 0.05 property var sdata: [] property int timeRescale: 0 - function reset() - { + function reset() { chartView.removeAllSeries(); - chartView.sdata=[] - chartView.time=0 - axisY.min=-dataPaddingZero - axisY.max=dataPaddingZero - axisY.tickCount=4 - axisY.applyNiceNumbers() - speed=0 + chartView.sdata = []; + chartView.time = 0; + axisY.min = -dataPaddingZero; + axisY.max = dataPaddingZero; + axisY.tickCount = 4; + axisY.applyNiceNumbers(); + speed = 0; } - function appendData() - { - var t=time+1; - var v=0 - var fact={} - for(var i=0;i21){ - timeRescale=t - var d=sdata.length-samples*facts.length - if(d>0)sdata.splice(0,d) - var p=apx.seriesBounds(sdata) - var min=p.x-dataPadding - var max=p.y+dataPadding - if(min==max){ - min-=dataPaddingZero - max+=dataPaddingZero + if ((t - timeRescale) > 21) { + timeRescale = t; + var d = sdata.length - samples * facts.length; + if (d > 0) + sdata.splice(0, d); + var p = apx.seriesBounds(sdata); + var min = p.x - dataPadding; + var max = p.y + dataPadding; + if (min == max) { + min -= dataPaddingZero; + max += dataPaddingZero; } - var bmod=false - if(axisY.minmax){ - axisY.max=max - bmod=true + if (axisY.max > max) { + axisY.max = max; + bmod = true; } - if(bmod){ - axisY.tickCount=4 - axisY.applyNiceNumbers() + if (bmod) { + axisY.tickCount = 4; + axisY.applyNiceNumbers(); } } - time=t - dataExist=true + time = t; + dataExist = true; } - function appendDataValue(fact, t, i){ - if(i>=chartView.count)addFactSeries(fact) - var s=chartView.series(i) + function appendDataValue(fact, t, i) { + if (i >= chartView.count) + addFactSeries(fact); + var s = chartView.series(i); - var value=fact.value!=undefined?fact.value:eval(fact.name) + var value = fact.value != undefined ? fact.value : eval(fact.name); - if(!isFinite(value))value=0 - s.append(t,value); - sdata.push(value) + if (!isFinite(value)) + value = 0; + s.append(t, value); + sdata.push(value); //instant rescale - grow - if(axisY.maxvalue){ - axisY.min=value-dataPadding; + if (axisY.min > value) { + axisY.min = value - dataPadding; } //remove old - var cnt=samples - if(s.count>cnt) s.removePoints(0,s.count-cnt) + var cnt = samples; + if (s.count > cnt) + s.removePoints(0, s.count - cnt); } - function addFactSeries(fact) - { - var s = chartView.createSeries(ui.antialiasing?ChartView.SeriesTypeLine:ChartView.SeriesTypeLine,fact.title,axisX, axisY) - s.useOpenGL = Qt.binding(function(){return openGL}) - s.capStyle=Qt.RoundCap + function addFactSeries(fact) { + var s = chartView.createSeries(ui.antialiasing ? ChartView.SeriesTypeLine : ChartView.SeriesTypeLine, fact.title, axisX, axisY); + s.useOpenGL = Qt.binding(function () { + return openGL; + }); + s.capStyle = Qt.RoundCap; //s.opacity=0.7 - var color = fact.opts.color - if(!color) color = Qt.rgba(1,1,1,1) - - if(fact.name.startsWith("cmd")){ - s.width=Qt.binding(function(){return lineWidthCmd}) - s.color=Qt.hsla(color.hslHue, color.hslSaturation/2, color.hslLightness*1.2, 1) - }else{ - s.width=Qt.binding(function(){return lineWidth}) - s.color=color + var color = fact.opts.color; + if (!color) + color = Qt.rgba(1, 1, 1, 1); + + if (fact.name.startsWith("cmd")) { + s.width = Qt.binding(function () { + return lineWidthCmd; + }); + s.color = Qt.hsla(color.hslHue, color.hslSaturation / 2, color.hslLightness * 1.2, 1); + } else { + s.width = Qt.binding(function () { + return lineWidth; + }); + s.color = color; } - return s + return s; } - } - - function changeSpeed() - { - if((speed+1) Date: Sun, 29 Mar 2026 20:44:04 +0300 Subject: [PATCH 005/163] Add filters menu. --- .../{FltChartsButton.qml => FcButton.qml} | 12 +-- .../{FltChartsView.qml => FcChartsView.qml} | 28 +++--- .../FilteredCharts/FcFilterRunningAvg.qml | 92 +++++++++++++++++++ .../Tools/FilteredCharts/FcFiltersMenu.qml | 87 ++++++++++++++++++ ...FltChartsMenuChart.qml => FcMenuChart.qml} | 8 ++ .../{FltChartsMenuSet.qml => FcMenuSet.qml} | 31 ++++--- .../Tools/FilteredCharts/FilteredCharts.qml | 36 ++++---- 7 files changed, 242 insertions(+), 52 deletions(-) rename src/Plugins/Tools/FilteredCharts/{FltChartsButton.qml => FcButton.qml} (89%) rename src/Plugins/Tools/FilteredCharts/{FltChartsView.qml => FcChartsView.qml} (90%) create mode 100644 src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml create mode 100644 src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml rename src/Plugins/Tools/FilteredCharts/{FltChartsMenuChart.qml => FcMenuChart.qml} (95%) rename src/Plugins/Tools/FilteredCharts/{FltChartsMenuSet.qml => FcMenuSet.qml} (88%) diff --git a/src/Plugins/Tools/FilteredCharts/FltChartsButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml similarity index 89% rename from src/Plugins/Tools/FilteredCharts/FltChartsButton.qml rename to src/Plugins/Tools/FilteredCharts/FcButton.qml index 69ba5308c..df48e113c 100644 --- a/src/Plugins/Tools/FilteredCharts/FltChartsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -26,7 +26,7 @@ import QtQuick.Layouts import Apx.Common TextButton { - id: fltBtn + id: fcBtn Layout.fillHeight: true checkable: true @@ -42,13 +42,13 @@ TextButton { if (checked) textInput.visible = !textInput.visible; if (checked) - if (!fltMenuSet.active) { - fltMenuSet.trigger(); + if (!fcMenuSet.active) { + fcMenuSet.trigger(); } else {} } property var values: [] - onActivated: fltCharts.facts = Qt.binding(function () { + onActivated: fcCharts.facts = Qt.binding(function () { return values; }) @@ -63,7 +63,7 @@ TextButton { return s.join("
"); } - FltChartsMenuSet { - id: fltMenuSet + FcMenuSet { + id: fcMenuSet } } diff --git a/src/Plugins/Tools/FilteredCharts/FltChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml similarity index 90% rename from src/Plugins/Tools/FilteredCharts/FltChartsView.qml rename to src/Plugins/Tools/FilteredCharts/FcChartsView.qml index 9482afaca..1755a0849 100644 --- a/src/Plugins/Tools/FilteredCharts/FltChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -25,7 +25,7 @@ import QtQuick.Controls import QtQml Item { - id: fltChartItem + id: fcChartItem //clip: true property var facts: [] @@ -41,18 +41,18 @@ Item { property real speedFactorValue: 1 onFactsChanged: { - fltChartView.reset(); + fcChartView.reset(); } Connections { target: apx.fleet.current.mandala function onTelemetryDecoded() { - fltChartView.appendData(); + fcChartView.appendData(); } } ChartView { - id: fltChartView + id: fcChartView antialiasing: ui.antialiasing legend.visible: false @@ -81,16 +81,16 @@ Item { ValueAxis { id: axisX - property real t: fltChartView.time + property real t: fcChartView.time Behavior on t { - enabled: ui.smooth && fltChartView.dataExist + enabled: ui.smooth && fcChartView.dataExist NumberAnimation { duration: 500 } } - min: t - fltChartView.samples + 20 + min: t - fcChartView.samples + 20 max: t - //min: - fltChartView.samples //t- fltChartView.samples+20 + //min: - fcChartView.samples //t- fcChartView.samples+20 //max: 0 //t visible: false gridVisible: false @@ -115,9 +115,9 @@ Item { property int timeRescale: 0 function reset() { - fltChartView.removeAllSeries(); - fltChartView.sdata = []; - fltChartView.time = 0; + fcChartView.removeAllSeries(); + fcChartView.sdata = []; + fcChartView.time = 0; axisY.min = -dataPaddingZero; axisY.max = dataPaddingZero; axisY.tickCount = 4; @@ -164,9 +164,9 @@ Item { } function appendDataValue(fact, t, i) { - if (i >= fltChartView.count) + if (i >= fcChartView.count) addFactSeries(fact); - var s = fltChartView.series(i); + var s = fcChartView.series(i); var value = fact.value != undefined ? fact.value : eval(fact.name); @@ -188,7 +188,7 @@ Item { } function addFactSeries(fact) { - var s = fltChartView.createSeries(ui.antialiasing ? ChartView.SeriesTypeLine : ChartView.SeriesTypeLine, fact.title, axisX, axisY); + var s = fcChartView.createSeries(ui.antialiasing ? ChartView.SeriesTypeLine : ChartView.SeriesTypeLine, fact.title, axisX, axisY); s.useOpenGL = Qt.binding(function () { return openGL; }); diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml new file mode 100644 index 000000000..60d1b7bc2 --- /dev/null +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -0,0 +1,92 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick + +import APX.Facts + +Fact { + id: filter + flags: Fact.Group + + property bool newItem: false + + property var data: ({}) + + // signal addTriggered + // signal removeTriggered + + // Component.onCompleted: { + // load(data); + // updateTitle(); + // updateDescr(); + // mTitle.valueChanged.connect(updateTitle); + // } + + // function load() { + // for (var i = 0; i < size; ++i) { + // var f = child(i); + // var v = data[settingName(f)]; + // f.value = v; + // } + // } + + // function save() { + // data = {}; + // for (var i = 0; i < size; ++i) { + // var f = child(i); + // var s = f.text.trim(); + // if (s === "") + // continue; + // data[settingName(f)] = s; + // } + // return data; + // } + + // function settingName(f) { + // var n = f.name; + // if (n.includes("_")) + // return n.slice(0, n.indexOf("_")); + // return n; + // } + + Fact { + id: raCoef + name: "running_avg_coef" + title: qsTr("Coefficient") + descr: qsTr("Coefficient for filtration") + flags: Fact.Float + value: 0 + min: 0 + max: 1 + + onValueChanged: { + console.log("running avg coef = ", value); + } + } + + Fact { + title: qsTr("Save") + flags: (Fact.Action | Fact.Apply) + icon: "check-circle" + // onTriggered: save() + } +} diff --git a/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml b/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml new file mode 100644 index 000000000..eb4e178ab --- /dev/null +++ b/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml @@ -0,0 +1,87 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick + +import APX.Facts + +Fact { + id: filter + flags: Fact.Group + + property bool newItem: false + + property var data: ({}) + + signal addTriggered + signal removeTriggered + + // Component.onCompleted: { + // load(data); + // // updateTitle(); + // // updateDescr(); + // // mTitle.valueChanged.connect(updateTitle); + // } + + // function load() { + // for (var i = 0; i < size; ++i) { + // var f = child(i); + // var v = data[settingName(f)]; + // f.value = v; + // } + // } + + // function save() { + // data = {}; + // for (var i = 0; i < size; ++i) { + // var f = child(i); + // var s = f.text.trim(); + // if (s === "") + // continue; + // data[settingName(f)] = s; + // } + // return data; + // } + + // function settingName(f) { + // var n = f.name; + // if (n.includes("_")) + // return n.slice(0, n.indexOf("_")); + // return n; + // } + + Fact { + id: mFilter + name: "filters" + title: qsTr("Filter") + descr: qsTr("Selecting the filter to use") + flags: Fact.Enum + enumStrings: ["none", "running avg"] + // onValueChanged: updateDescr() + } + + FcFilterRunningAvg { + id: mRunningAvg + name: "running_avg_filter" + title: qsTr("Running average") + descr: qsTr("Running average filter settings") + } +} diff --git a/src/Plugins/Tools/FilteredCharts/FltChartsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml similarity index 95% rename from src/Plugins/Tools/FilteredCharts/FltChartsMenuChart.qml rename to src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 678d3f78e..80f6af7aa 100644 --- a/src/Plugins/Tools/FilteredCharts/FltChartsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -125,6 +125,14 @@ Fact { enumStrings: ["red", "orange", "yelow", "green", "aqua", "blue", "purple", "pink"] // onValueChanged: updateDescr() } + FcFiltersMenu { + id: mFilters + name: "filters_num" + title: qsTr("Filters") + descr: qsTr("Avaliable filters") + + // onValueChanged: updateDescr() + } Fact { name: "warn" title: qsTr("Warning") diff --git a/src/Plugins/Tools/FilteredCharts/FltChartsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml similarity index 88% rename from src/Plugins/Tools/FilteredCharts/FltChartsMenuSet.qml rename to src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 4f6d222cc..da8c59eb3 100644 --- a/src/Plugins/Tools/FilteredCharts/FltChartsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -26,13 +26,14 @@ import APX.Facts Fact { id: setFact flags: (Fact.Group | Fact.FlatModel) - title: "Charts #" + fltBtn.text + title: "Charts #" + fcBtn.text property var values //from config signal selected(var num) property int editorsCnt: 1 + Fact { id: setTitle title: qsTr("Title") @@ -41,7 +42,7 @@ Fact { icon: "rename-box" value: setFact.title onValueChanged: { - fltBtn.toolTip = value; + fcBtn.toolTip = value; } } @@ -61,7 +62,7 @@ Fact { } } - FltChartsMenuChart { + FcMenuChart { title: qsTr("Add new chart") descr: "Creating and setting a new chart" icon: "plus-circle" @@ -102,17 +103,19 @@ Fact { updateDescr(); setValues.onSizeChanged.connect(updateDescr); } + function createNumber(number) { if (!number.bind) return; if (number.bind === "") return; - var c = createFact(setValues, "FltChartsMenuChart.qml", { + var c = createFact(setValues, "FcMenuChart.qml", { "data": number }); c.titleChanged.connect(updateDescr); c.removeTriggered.connect(updateDescr); } + function updateDescr() { if (!setFact) return; @@ -135,14 +138,14 @@ Fact { // } // } - Fact { - flags: (Fact.Action | Fact.Apply) - title: qsTr("Select and save") - visible: !setFact.active - icon: "check-circle" - onTriggered: { - setFact.menuBack(); - setFact.selected(setFact.num); - } - } + // Fact { + // flags: (Fact.Action | Fact.Apply) + // title: qsTr("Select and save") + // visible: !setFact.active + // icon: "check-circle" + // onTriggered: { + // setFact.menuBack(); + // setFact.selected(setFact.num); + // } + // } } diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 3ab784daa..45ee82203 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -28,7 +28,7 @@ import QtCore import Apx.Common Rectangle { - id: fltControl + id: fcControl implicitHeight: layout.implicitHeight implicitWidth: layout.implicitWidth @@ -41,8 +41,8 @@ Rectangle { anchors.fill: parent spacing: 0 - FltChartsView { - id: fltCharts + FcChartsView { + id: fcCharts facts: [] Layout.fillWidth: true Layout.fillHeight: true @@ -108,7 +108,7 @@ Rectangle { textInput.facts = flist; if (plusButton.checked) - fltCharts.facts = flist; + fcCharts.facts = flist; } } @@ -123,51 +123,51 @@ Rectangle { Layout.margins: Style.spacing spacing: 3 Layout.maximumHeight: 24 * ui.scale - FltChartsButton { + FcButton { text: "1" checked: true values: [mandala.cmd.att.roll, mandala.est.att.roll] } - FltChartsButton { + FcButton { text: "2" values: [mandala.cmd.att.pitch, mandala.est.att.pitch] } - FltChartsButton { + FcButton { text: "3" values: [mandala.cmd.pos.bearing, mandala.cmd.att.yaw, mandala.est.att.yaw] } - FltChartsButton { + FcButton { text: "4" values: [mandala.est.acc.x, mandala.est.acc.y] } - FltChartsButton { + FcButton { text: "5" values: [mandala.est.acc.z] } - FltChartsButton { + FcButton { text: "6" values: [mandala.est.gyro.x, mandala.est.gyro.y, mandala.est.gyro.z] } - FltChartsButton { + FcButton { text: "7" values: [mandala.est.pos.altitude, mandala.est.pos.vspeed, mandala.est.air.airspeed] } - FltChartsButton { + FcButton { text: "8" values: [mandala.ctr.att.ail, mandala.ctr.att.elv, mandala.ctr.att.rud, mandala.ctr.eng.thr, mandala.ctr.eng.prop, mandala.ctr.str.rud] } - FltChartsButton { + FcButton { text: "9" values: [mandala.cmd.rc.roll, mandala.cmd.rc.pitch, mandala.cmd.rc.thr, mandala.cmd.rc.yaw] } - FltChartsButton { + FcButton { text: "10" values: [mandala.est.usr.u1, mandala.est.usr.u2, mandala.est.usr.u3, mandala.est.usr.u4, mandala.est.usr.u5, mandala.est.usr.u6] } TextButton { - text: fltCharts.speedFactorValue + "x" - // onClicked: fltCharts.changeSpeed() + text: fcCharts.speedFactorValue + "x" + // onClicked: fcCharts.changeSpeed() Layout.fillHeight: true Layout.minimumWidth: height * 3 } @@ -189,13 +189,13 @@ Rectangle { Settings { category: "filtredCharts" - property alias page: fltControl.currentPage + property alias page: fcControl.currentPage property alias custom: textInput.text } Component.onCompleted: { for (var i = 0; i < buttonGroup.buttons.length; ++i) { var b = buttonGroup.buttons[i]; - if (b.text !== fltControl.currentPage) + if (b.text !== fcControl.currentPage) continue; buttonGroup.checkedButton = b; break; From 7487126f13bb762040d2a065d0060d86164cf966 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 30 Mar 2026 11:20:41 +0300 Subject: [PATCH 006/163] Setting up chart speed. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 20 +++++++------ .../Tools/FilteredCharts/FcChartsView.qml | 2 -- .../FilteredCharts/FcFilterRunningAvg.qml | 1 - .../Tools/FilteredCharts/FcMenuSet.qml | 13 +++++---- .../Tools/FilteredCharts/FilteredCharts.qml | 28 +++++++++---------- 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index df48e113c..066002ec1 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -34,17 +34,21 @@ TextButton { textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor // toolTip: getToolTip(values) - onCheckedChanged: { - if (!checked) - textInput.visible = false; - } + // onCheckedChanged: { + // if (!checked) + // textInput.visible = false; + // } onPressed: { - if (checked) - textInput.visible = !textInput.visible; - if (checked) + // if (checked) { + // textInput.visible = !textInput.visible; + // } + if (checked) { if (!fcMenuSet.active) { fcMenuSet.trigger(); - } else {} + } + } else { + fcCharts.speedFactorValue = fcMenuSet.speed; + } } property var values: [] diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index 1755a0849..7ddaaefe8 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -90,8 +90,6 @@ Item { } min: t - fcChartView.samples + 20 max: t - //min: - fcChartView.samples //t- fcChartView.samples+20 - //max: 0 //t visible: false gridVisible: false labelsVisible: false diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index 60d1b7bc2..62bb98aab 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -77,7 +77,6 @@ Fact { value: 0 min: 0 max: 1 - onValueChanged: { console.log("running avg coef = ", value); } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index da8c59eb3..14ff83e8e 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -28,6 +28,8 @@ Fact { flags: (Fact.Group | Fact.FlatModel) title: "Charts #" + fcBtn.text + property real speed: msSpeed.value + property var values //from config signal selected(var num) @@ -35,7 +37,7 @@ Fact { property int editorsCnt: 1 Fact { - id: setTitle + id: msTitle title: qsTr("Title") descr: qsTr("Charts title") flags: Fact.Text @@ -47,17 +49,18 @@ Fact { } Fact { - id: setSpeed + id: msSpeed title: qsTr("Speed") descr: qsTr("Charts speed") flags: Fact.Float icon: "speedometer" value: 1.0 precision: 1 - min: 0.1 - max: 5 + min: 0.2 + max: 4 onValueChanged: { - speed = value; + fcCharts.speed = value; + fcCharts.speedFactorValue = value; console.log("Speed =", value); } } diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 45ee82203..0a4ab3cc5 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -36,6 +36,19 @@ Rectangle { border.width: 0 color: "#000" + Component.onCompleted: { + for (var i = 0; i < buttonGroup.buttons.length; ++i) { + var b = buttonGroup.buttons[i]; + if (b.text !== fcControl.currentPage) + continue; + buttonGroup.checkedButton = b; + break; + } + if (buttonGroup.checkedButton == null) { + buttonGroup.checkedButton = buttonGroup.buttons[0]; //showPage("R") + } + } + ColumnLayout { id: layout anchors.fill: parent @@ -114,7 +127,6 @@ Rectangle { ButtonGroup { id: buttonGroup - // buttons: bottomArea.buttons } RowLayout { @@ -169,7 +181,7 @@ Rectangle { text: fcCharts.speedFactorValue + "x" // onClicked: fcCharts.changeSpeed() Layout.fillHeight: true - Layout.minimumWidth: height * 3 + Layout.minimumWidth: height * 4 } } } @@ -192,16 +204,4 @@ Rectangle { property alias page: fcControl.currentPage property alias custom: textInput.text } - Component.onCompleted: { - for (var i = 0; i < buttonGroup.buttons.length; ++i) { - var b = buttonGroup.buttons[i]; - if (b.text !== fcControl.currentPage) - continue; - buttonGroup.checkedButton = b; - break; - } - if (buttonGroup.checkedButton == null) { - buttonGroup.checkedButton = buttonGroup.buttons[0]; //showPage("R") - } - } } From 5569e0632eeabab6a66b8d484c2f969f4b33162c Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 30 Mar 2026 13:02:51 +0300 Subject: [PATCH 007/163] Chart item addition implemented. --- .../Tools/FilteredCharts/FcChartsView.qml | 2 +- .../Tools/FilteredCharts/FcMenuChart.qml | 63 ++++++++++------- .../Tools/FilteredCharts/FcMenuSet.qml | 70 +++++++++++-------- 3 files changed, 77 insertions(+), 58 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index 7ddaaefe8..37377c55c 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -26,7 +26,7 @@ import QtQml Item { id: fcChartItem - //clip: true + property var facts: [] property bool openGL: false //apx.settings.graphics.opengl.value diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 80f6af7aa..b1572a3c7 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -24,7 +24,8 @@ import QtQuick import APX.Facts Fact { - id: number + // id: number + id: mChart flags: Fact.Group property bool newItem: false @@ -36,9 +37,9 @@ Fact { Component.onCompleted: { load(data); - // updateTitle(); + updateTitle(); // updateDescr(); - // mTitle.valueChanged.connect(updateTitle); + mTitle.valueChanged.connect(updateTitle); } function load() { @@ -74,26 +75,26 @@ Fact { title = mTitle.text ? mTitle.text : mBind.text; } - function updateDescr() { - //list non-zero values in descr - var descrList = []; - for (var i = 0; i < size; ++i) { - var f = child(i); - if (!f.name) - continue; - if (f.name === "title") - continue; - if (f.name === "color") - continue; - if (f.text === "") - continue; - descrList.push(f.name.toUpperCase() + ": " + f.text); - } - if (descrList.length > 0) - descr = descrList.join(", "); - else - descr = ""; - } + // function updateDescr() { + // //list non-zero values in descr + // var descrList = []; + // for (var i = 0; i < size; ++i) { + // var f = child(i); + // if (!f.name) + // continue; + // if (f.name === "title") + // continue; + // if (f.name === "color") + // continue; + // if (f.text === "") + // continue; + // descrList.push(f.name.toUpperCase() + ": " + f.text); + // } + // if (descrList.length > 0) + // descr = descrList.join(", "); + // else + // descr = ""; + // } // Fact { // id: mFact @@ -108,6 +109,14 @@ Fact { // //value=null // } // } + + Fact { + id: mTitle + title: qsTr("Title") + descr: qsTr("Chart name") + flags: Fact.Text + } + Fact { id: mBind name: "bind_num" @@ -130,7 +139,6 @@ Fact { name: "filters_num" title: qsTr("Filters") descr: qsTr("Avaliable filters") - // onValueChanged: updateDescr() } Fact { @@ -157,14 +165,15 @@ Fact { enabled: false // onValueChanged: updateDescr() } - //actions + + // Actions Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Add") enabled: (newItem && mBind && mBind.value) ? true : false icon: "plus-circle" onTriggered: { - number.menuBack(); + mChart.menuBack(); addTriggered(); } } @@ -175,7 +184,7 @@ Fact { icon: "delete" onTriggered: { removeTriggered(); - number.deleteFact(); + mChart.deleteFact(); } } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 14ff83e8e..aab5c5a5b 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -24,25 +24,24 @@ import QtQuick import APX.Facts Fact { - id: setFact + id: chartFact flags: (Fact.Group | Fact.FlatModel) title: "Charts #" + fcBtn.text property real speed: msSpeed.value property var values //from config + property int editorsCnt: 1 signal selected(var num) - property int editorsCnt: 1 - Fact { id: msTitle title: qsTr("Title") descr: qsTr("Charts title") flags: Fact.Text icon: "rename-box" - value: setFact.title + value: chartFact.title onValueChanged: { fcBtn.toolTip = value; } @@ -70,11 +69,12 @@ Fact { descr: "Creating and setting a new chart" icon: "plus-circle" newItem: true - onAddTriggered: createNumber(save()) + // onAddTriggered: createNumber(save()) + onAddTriggered: createChart(save()) } Fact { - id: setValues + id: msValues title: qsTr("Values") flags: (Fact.Group | Fact.Section | Fact.DragChildren) } @@ -83,11 +83,11 @@ Fact { function save() { var values = []; - for (var i = 0; i < setValues.size; ++i) { - var number = setValues.child(i).save(); - if (!number.bind) + for (var i = 0; i < msValues.size; ++i) { + var mChart = msValues.child(i).save(); + if (!mChart.bind) continue; - values.push(number); + values.push(mChart); } if (!values) return; @@ -98,36 +98,46 @@ Fact { } function updateSetItems() { - setValues.onSizeChanged.disconnect(updateDescr); - setValues.deleteChildren(); + msValues.onSizeChanged.disconnect(updateDescr); + msValues.deleteChildren(); for (var i in values) { - createNumber(values[i]); + // createNumber(values[i]); + createChart(values[i]); } updateDescr(); - setValues.onSizeChanged.connect(updateDescr); + msValues.onSizeChanged.connect(updateDescr); } - function createNumber(number) { - if (!number.bind) + function createChart(mChart) { + if (!mChart.bind) return; - if (number.bind === "") + if (mChart.bind === "") return; - var c = createFact(setValues, "FcMenuChart.qml", { - "data": number + var c = createFact(msValues, "FcMenuChart.qml", { + "data": mChart }); c.titleChanged.connect(updateDescr); c.removeTriggered.connect(updateDescr); } function updateDescr() { - if (!setFact) + if (!chartFact) return; - descr = ""; - var s = []; - for (var i = 0; i < setValues.size; ++i) { - s.push(setValues.child(i).title); + // descr = ""; + // var s = []; + // for (var i = 0; i < msValues.size; ++i) { + // s.push(msValues.child(i).title); + // } + // descr = s.join(','); + } + + function createFact(parent, url, opts) { + var component = Qt.createComponent(url); + if (component.status === Component.Ready) { + var c = component.createObject(parent, opts); + c.parentFact = parent; + return c; } - descr = s.join(','); } // Fact { @@ -135,20 +145,20 @@ Fact { // title: qsTr("Remove set") // icon: "delete" // onTriggered: { - // if (setFact.active) + // if (chartFact.active) // select(0); - // setFact.destroy(); + // chartFact.destroy(); // } // } // Fact { // flags: (Fact.Action | Fact.Apply) // title: qsTr("Select and save") - // visible: !setFact.active + // visible: !chartFact.active // icon: "check-circle" // onTriggered: { - // setFact.menuBack(); - // setFact.selected(setFact.num); + // chartFact.menuBack(); + // chartFact.selected(chartFact.num); // } // } } From bec85af440f68b503bc6e45da2bf5d367549a1bc Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 30 Mar 2026 15:32:36 +0300 Subject: [PATCH 008/163] Charts description logic added. --- .../Tools/FilteredCharts/FcMenuChart.qml | 64 +++++++++---------- .../Tools/FilteredCharts/FcMenuSet.qml | 30 ++++----- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index b1572a3c7..2c0cffabe 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -38,12 +38,14 @@ Fact { Component.onCompleted: { load(data); updateTitle(); - // updateDescr(); + updateDescr(); mTitle.valueChanged.connect(updateTitle); + mBind.valueChanged.connect(updateDescr); + mColor.valueChanged.connect(updateDescr); } function load() { - for (var i = 0; i < size; ++i) { + for (var i = 0; i < mChart.size; ++i) { var f = child(i); var v = data[settingName(f)]; f.value = v; @@ -52,7 +54,7 @@ Fact { function save() { data = {}; - for (var i = 0; i < size; ++i) { + for (var i = 0; i < mChart.size; ++i) { var f = child(i); var s = f.text.trim(); if (s === "") @@ -75,26 +77,27 @@ Fact { title = mTitle.text ? mTitle.text : mBind.text; } - // function updateDescr() { - // //list non-zero values in descr - // var descrList = []; - // for (var i = 0; i < size; ++i) { - // var f = child(i); - // if (!f.name) - // continue; - // if (f.name === "title") - // continue; - // if (f.name === "color") - // continue; - // if (f.text === "") - // continue; - // descrList.push(f.name.toUpperCase() + ": " + f.text); - // } - // if (descrList.length > 0) - // descr = descrList.join(", "); - // else - // descr = ""; - // } + function updateDescr() { + if (newItem) + return; + + //list non-zero values in descr + var descrList = []; + for (var i = 0; i < mChart.size; ++i) { + var f = child(i); + if (!f.name) + continue; + if (f.name === "title") + continue; + if (f.text === "") + continue; + descrList.push(f.name.toUpperCase() + ": " + f.text); + } + if (descrList.length > 0) + descr = descrList.join(", "); + else + descr = ""; + } // Fact { // id: mFact @@ -119,27 +122,24 @@ Fact { Fact { id: mBind - name: "bind_num" + name: "bind" title: qsTr("Expression") descr: "Math.atan(est.att.pitch/est.att.roll)" flags: Fact.Text - // onValueChanged: updateDescr() } Fact { id: mColor - name: "color_num" + name: "color" title: qsTr("Color") descr: qsTr("Chart color") flags: Fact.Enum enumStrings: ["red", "orange", "yelow", "green", "aqua", "blue", "purple", "pink"] - // onValueChanged: updateDescr() } FcFiltersMenu { id: mFilters - name: "filters_num" + name: "filters" title: qsTr("Filters") descr: qsTr("Avaliable filters") - // onValueChanged: updateDescr() } Fact { name: "warn" @@ -147,7 +147,7 @@ Fact { descr: qsTr("Expression for warning") flags: Fact.Text enabled: false - // onValueChanged: updateDescr() + visible: false } Fact { name: "alarm" @@ -155,7 +155,7 @@ Fact { descr: "value>1.8 || (value>0 && value<1)" flags: Fact.Text enabled: false - // onValueChanged: updateDescr() + visible: false } Fact { name: "act" @@ -163,7 +163,7 @@ Fact { descr: "cmd.proc.action=proc_action_reset" flags: Fact.Text enabled: false - // onValueChanged: updateDescr() + visible: false } // Actions diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index aab5c5a5b..b6626b879 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -98,14 +98,14 @@ Fact { } function updateSetItems() { - msValues.onSizeChanged.disconnect(updateDescr); + // msValues.onSizeChanged.disconnect(updateDescr); msValues.deleteChildren(); for (var i in values) { // createNumber(values[i]); createChart(values[i]); } - updateDescr(); - msValues.onSizeChanged.connect(updateDescr); + // updateDescr(); + // msValues.onSizeChanged.connect(updateDescr); } function createChart(mChart) { @@ -116,20 +116,20 @@ Fact { var c = createFact(msValues, "FcMenuChart.qml", { "data": mChart }); - c.titleChanged.connect(updateDescr); - c.removeTriggered.connect(updateDescr); + // c.titleChanged.connect(updateDescr); + // c.removeTriggered.connect(updateDescr); } - function updateDescr() { - if (!chartFact) - return; - // descr = ""; - // var s = []; - // for (var i = 0; i < msValues.size; ++i) { - // s.push(msValues.child(i).title); - // } - // descr = s.join(','); - } + // function updateDescr() { + // if (!chartFact) + // return; + // descr = ""; + // var s = []; + // for (var i = 0; i < msValues.size; ++i) { + // s.push(msValues.child(i).title); + // } + // descr = s.join(','); + // } function createFact(parent, url, opts) { var component = Qt.createComponent(url); From 7b512e9a17a86a4a2472157c8ec77a0e49611e3b Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 30 Mar 2026 18:58:28 +0300 Subject: [PATCH 009/163] Set new chart color. --- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 2c0cffabe..56e77f859 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -39,9 +39,13 @@ Fact { load(data); updateTitle(); updateDescr(); + setColor(); mTitle.valueChanged.connect(updateTitle); mBind.valueChanged.connect(updateDescr); mColor.valueChanged.connect(updateDescr); + + // Debug purposes only + // value = Math.random() * 10; } function load() { @@ -99,6 +103,12 @@ Fact { descr = ""; } + function setColor() { + var opt = mChart.opts; + opt.color = mColor.text; + mChart.opts = opt; + } + // Fact { // id: mFact // title: qsTr("Binding") @@ -134,6 +144,7 @@ Fact { descr: qsTr("Chart color") flags: Fact.Enum enumStrings: ["red", "orange", "yelow", "green", "aqua", "blue", "purple", "pink"] + onTextChanged: setColor() } FcFiltersMenu { id: mFilters From 21b5e7aa528ee3246d2e2632709844ab08ebecc9 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 30 Mar 2026 19:56:16 +0300 Subject: [PATCH 010/163] Charts values forwarding. --- src/Plugins/Tools/FilteredCharts/FcChartsView.qml | 14 +++++++------- .../Tools/FilteredCharts/FcFilterRunningAvg.qml | 1 + src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 2 +- src/Plugins/Tools/FilteredCharts/FcMenuSet.qml | 11 ++++++++++- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index 37377c55c..c7a95bf3b 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -212,11 +212,11 @@ Item { } } - function changeSpeed() { - if ((speed + 1) < speedFactor.length) - speed += 1; - else - speed = 0; - //console.log(speed) - } + // function changeSpeed() { + // if ((speed + 1) < speedFactor.length) + // speed += 1; + // else + // speed = 0; + // //console.log(speed) + // } } diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index 62bb98aab..bc1adff64 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -82,6 +82,7 @@ Fact { } } + // Actions Fact { title: qsTr("Save") flags: (Fact.Action | Fact.Apply) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 56e77f859..26b7cc57d 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -143,7 +143,7 @@ Fact { title: qsTr("Color") descr: qsTr("Chart color") flags: Fact.Enum - enumStrings: ["red", "orange", "yelow", "green", "aqua", "blue", "purple", "pink"] + enumStrings: ["red", "orange", "yellow", "green", "aqua", "blue", "purple", "violet"] onTextChanged: setColor() } FcFiltersMenu { diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index b6626b879..4de4f5565 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -77,10 +77,19 @@ Fact { id: msValues title: qsTr("Values") flags: (Fact.Group | Fact.Section | Fact.DragChildren) + onSizeChanged: updateBtnValues() } Component.onCompleted: updateSetItems() + function updateBtnValues() { + fcBtn.values = []; + for (var i = 0; i < msValues.size; ++i) { + var fact = msValues.child(i); + fcBtn.values.push(fact); + } + } + function save() { var values = []; for (var i = 0; i < msValues.size; ++i) { @@ -101,7 +110,6 @@ Fact { // msValues.onSizeChanged.disconnect(updateDescr); msValues.deleteChildren(); for (var i in values) { - // createNumber(values[i]); createChart(values[i]); } // updateDescr(); @@ -140,6 +148,7 @@ Fact { } } + // Actions // Fact { // flags: (Fact.Action | Fact.Remove) // title: qsTr("Remove set") From f8b3927b6e2589cfce684403e757014f2de0c76c Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 31 Mar 2026 02:09:58 +0300 Subject: [PATCH 011/163] Displaying live charts first iteration (not testing). --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 16 ++++++++-------- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 10 +++++++--- src/Plugins/Tools/FilteredCharts/FcMenuSet.qml | 13 +++++++++---- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index 066002ec1..d6b225b37 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -32,16 +32,8 @@ TextButton { checkable: true ButtonGroup.group: buttonGroup textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor - // toolTip: getToolTip(values) - // onCheckedChanged: { - // if (!checked) - // textInput.visible = false; - // } onPressed: { - // if (checked) { - // textInput.visible = !textInput.visible; - // } if (checked) { if (!fcMenuSet.active) { fcMenuSet.trigger(); @@ -51,6 +43,14 @@ TextButton { } } + Connections { + target: apx.fleet.current.mandala + function onTelemetryDecoded() { + if (checked) + fcMenuSet.updateChartsValues(); + } + } + property var values: [] onActivated: fcCharts.facts = Qt.binding(function () { return values; diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 26b7cc57d..ad0fc41a3 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -43,9 +43,6 @@ Fact { mTitle.valueChanged.connect(updateTitle); mBind.valueChanged.connect(updateDescr); mColor.valueChanged.connect(updateDescr); - - // Debug purposes only - // value = Math.random() * 10; } function load() { @@ -109,6 +106,13 @@ Fact { mChart.opts = opt; } + function updateValue() { + var exp = mBind.text; + if (eval(exp) == undefined) + return; + value = eval(exp); + } + // Fact { // id: mFact // title: qsTr("Binding") diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 4de4f5565..773d27331 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -84,10 +84,15 @@ Fact { function updateBtnValues() { fcBtn.values = []; - for (var i = 0; i < msValues.size; ++i) { - var fact = msValues.child(i); - fcBtn.values.push(fact); - } + for (var i = 0; i < msValues.size; ++i) + fcBtn.values.push(msValues.child(i)); + } + + function updateChartsValues() { + if (!fcBtn.checked) + return; + for (var i = 0; i < msValues.size; ++i) + msValues.child(i).updateValue(); } function save() { From 1c8c6b3462119bf62cf0195a74718cc41bfd0dc0 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 1 Apr 2026 04:50:17 +0300 Subject: [PATCH 012/163] Filter saving added. --- .../FilteredCharts/FcFilterRunningAvg.qml | 84 +++++++++--------- .../Tools/FilteredCharts/FcFiltersMenu.qml | 87 +++++++++++-------- .../Tools/FilteredCharts/FcMenuChart.qml | 38 ++++++-- .../Tools/FilteredCharts/FcMenuSet.qml | 17 ++-- .../Tools/FilteredCharts/FilteredCharts.qml | 30 ++++--- 5 files changed, 156 insertions(+), 100 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index bc1adff64..67fe3f057 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -24,16 +24,11 @@ import QtQuick import APX.Facts Fact { - id: filter + id: raFilter flags: Fact.Group - property bool newItem: false - property var data: ({}) - // signal addTriggered - // signal removeTriggered - // Component.onCompleted: { // load(data); // updateTitle(); @@ -41,32 +36,43 @@ Fact { // mTitle.valueChanged.connect(updateTitle); // } - // function load() { - // for (var i = 0; i < size; ++i) { - // var f = child(i); - // var v = data[settingName(f)]; - // f.value = v; - // } - // } + function load() { + for (var i = 0; i < size; ++i) { + var f = child(i); + var v = data[settingName(f)]; + f.value = v; + } + } - // function save() { - // data = {}; - // for (var i = 0; i < size; ++i) { - // var f = child(i); - // var s = f.text.trim(); - // if (s === "") - // continue; - // data[settingName(f)] = s; - // } - // return data; - // } + function save() { + data = {}; + for (var i = 0; i < size; ++i) { + var f = child(i); + var s = f.text.trim(); + if (s === "") + continue; + data[settingName(f)] = s; + } + return data; + } - // function settingName(f) { - // var n = f.name; - // if (n.includes("_")) - // return n.slice(0, n.indexOf("_")); - // return n; - // } + function settingName(f) { + var n = f.name; + if (n.includes("_")) + return n.slice(0, n.indexOf("_")); + return n; + } + + function getCoef() { + return raCoef.value; + } + + function fillData() { + if (typeof value === 'object' && !Array.isArray(value) && value !== null) { + data = value; + load(); + } + } Fact { id: raCoef @@ -77,16 +83,14 @@ Fact { value: 0 min: 0 max: 1 - onValueChanged: { - console.log("running avg coef = ", value); - } + onValueChanged: raFilter.value = value } - // Actions - Fact { - title: qsTr("Save") - flags: (Fact.Action | Fact.Apply) - icon: "check-circle" - // onTriggered: save() - } + // // Actions + // Fact { + // title: qsTr("Apply") + // flags: (Fact.Action | Fact.Apply) + // icon: "check-circle" + // // onTriggered: save() + // } } diff --git a/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml b/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml index eb4e178ab..4b8b7f2c3 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml @@ -24,7 +24,7 @@ import QtQuick import APX.Facts Fact { - id: filter + id: filters flags: Fact.Group property bool newItem: false @@ -34,52 +34,69 @@ Fact { signal addTriggered signal removeTriggered - // Component.onCompleted: { - // load(data); - // // updateTitle(); - // // updateDescr(); - // // mTitle.valueChanged.connect(updateTitle); - // } + Component.onCompleted: { + fillData(); + // if (value != undefined) + // fType.value = value; + // else + // value = fType.text; - // function load() { - // for (var i = 0; i < size; ++i) { - // var f = child(i); - // var v = data[settingName(f)]; - // f.value = v; - // } - // } + // load(data); + // updateTitle(); + // updateDescr(); + // mTitle.valueChanged.connect(updateTitle); + } + + function load() { + console.log(); + for (var i = 0; i < size; ++i) { + var f = child(i); + var v = data[settingName(f)]; + f.value = v; + } + } - // function save() { - // data = {}; - // for (var i = 0; i < size; ++i) { - // var f = child(i); - // var s = f.text.trim(); - // if (s === "") - // continue; - // data[settingName(f)] = s; - // } - // return data; - // } + function save() { + data = {}; + for (var i = 0; i < size; ++i) { + var f = child(i); + var s = f.text.trim(); + if (f.size != 0) + s = f.save(); + if (s === "") + continue; + data[settingName(f)] = s; + } + return data; + } - // function settingName(f) { - // var n = f.name; - // if (n.includes("_")) - // return n.slice(0, n.indexOf("_")); - // return n; - // } + function settingName(f) { + var n = f.name; + if (n.includes("_")) + return n.slice(0, n.indexOf("_")); + return n; + } + + function fillData() { + if (typeof value === 'object' && !Array.isArray(value) && value !== null) { + data = value; + load(); + fRunningAvg.fillData(); + } + } Fact { - id: mFilter + id: fType name: "filters" title: qsTr("Filter") descr: qsTr("Selecting the filter to use") flags: Fact.Enum - enumStrings: ["none", "running avg"] - // onValueChanged: updateDescr() + enumStrings: ["none", "running_avg"] + onTextChanged: filters.value = text } FcFilterRunningAvg { - id: mRunningAvg + id: fRunningAvg name: "running_avg_filter" title: qsTr("Running average") descr: qsTr("Running average filter settings") diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index ad0fc41a3..019b015c5 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -45,6 +45,10 @@ Fact { mColor.valueChanged.connect(updateDescr); } + function updateFilters() { + mFilters.fillFilters(); + } + function load() { for (var i = 0; i < mChart.size; ++i) { var f = child(i); @@ -58,8 +62,12 @@ Fact { for (var i = 0; i < mChart.size; ++i) { var f = child(i); var s = f.text.trim(); - if (s === "") + if (f.size != 0) { + s = f.save(); + } + if (s === "") { continue; + } data[settingName(f)] = s; } return data; @@ -82,7 +90,7 @@ Fact { if (newItem) return; - //list non-zero values in descr + // List non-zero values in descr var descrList = []; for (var i = 0; i < mChart.size; ++i) { var f = child(i); @@ -110,7 +118,25 @@ Fact { var exp = mBind.text; if (eval(exp) == undefined) return; - value = eval(exp); + // Use filters + var v = eval(exp); + var type = mFilters.value; + console.log("type = ", type); + switch (type) { + case "running_avg": + useRunningAvgFilter(v); + default: + value = v; + } + } + + // Filters + function useRunningAvgFilter(v) { + var ra = mFilters.fRunningAvg; + var k = ra.getCoef(); + value += (v - value) * k; + + console.log("use running avg filter", v, "/", value); } // Fact { @@ -129,11 +155,11 @@ Fact { Fact { id: mTitle + name: "title" title: qsTr("Title") descr: qsTr("Chart name") flags: Fact.Text } - Fact { id: mBind name: "bind" @@ -152,9 +178,9 @@ Fact { } FcFiltersMenu { id: mFilters - name: "filters" + name: "filt" title: qsTr("Filters") - descr: qsTr("Avaliable filters") + descr: qsTr("Filters settings") } Fact { name: "warn" diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 773d27331..78dc0944f 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -60,7 +60,6 @@ Fact { onValueChanged: { fcCharts.speed = value; fcCharts.speedFactorValue = value; - console.log("Speed =", value); } } @@ -69,7 +68,6 @@ Fact { descr: "Creating and setting a new chart" icon: "plus-circle" newItem: true - // onAddTriggered: createNumber(save()) onAddTriggered: createChart(save()) } @@ -98,10 +96,10 @@ Fact { function save() { var values = []; for (var i = 0; i < msValues.size; ++i) { - var mChart = msValues.child(i).save(); - if (!mChart.bind) + var mchart = msValues.child(i).save(); + if (!mchart.bind) continue; - values.push(mChart); + values.push(mchart); } if (!values) return; @@ -121,14 +119,15 @@ Fact { // msValues.onSizeChanged.connect(updateDescr); } - function createChart(mChart) { - if (!mChart.bind) + function createChart(mchart) { + if (!mchart.bind) return; - if (mChart.bind === "") + if (mchart.bind === "") return; var c = createFact(msValues, "FcMenuChart.qml", { - "data": mChart + "data": mchart }); + // c.titleChanged.connect(updateDescr); // c.removeTriggered.connect(updateDescr); } diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 0a4ab3cc5..6398bffd9 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -138,43 +138,53 @@ Rectangle { FcButton { text: "1" checked: true - values: [mandala.cmd.att.roll, mandala.est.att.roll] + // values: [mandala.cmd.att.roll, mandala.est.att.roll] + values: [] } FcButton { text: "2" - values: [mandala.cmd.att.pitch, mandala.est.att.pitch] + // values: [mandala.cmd.att.pitch, mandala.est.att.pitch] + values: [] } FcButton { text: "3" - values: [mandala.cmd.pos.bearing, mandala.cmd.att.yaw, mandala.est.att.yaw] + // values: [mandala.cmd.pos.bearing, mandala.cmd.att.yaw, mandala.est.att.yaw] + values: [] } FcButton { text: "4" - values: [mandala.est.acc.x, mandala.est.acc.y] + // values: [mandala.est.acc.x, mandala.est.acc.y] + values: [] } FcButton { text: "5" - values: [mandala.est.acc.z] + // values: [mandala.est.acc.z] + values: [] } FcButton { text: "6" - values: [mandala.est.gyro.x, mandala.est.gyro.y, mandala.est.gyro.z] + // values: [mandala.est.gyro.x, mandala.est.gyro.y, mandala.est.gyro.z] + values: [] } FcButton { text: "7" - values: [mandala.est.pos.altitude, mandala.est.pos.vspeed, mandala.est.air.airspeed] + // values: [mandala.est.pos.altitude, mandala.est.pos.vspeed, mandala.est.air.airspeed] + values: [] } FcButton { text: "8" - values: [mandala.ctr.att.ail, mandala.ctr.att.elv, mandala.ctr.att.rud, mandala.ctr.eng.thr, mandala.ctr.eng.prop, mandala.ctr.str.rud] + // values: [mandala.ctr.att.ail, mandala.ctr.att.elv, mandala.ctr.att.rud, mandala.ctr.eng.thr, mandala.ctr.eng.prop, mandala.ctr.str.rud] + values: [] } FcButton { text: "9" - values: [mandala.cmd.rc.roll, mandala.cmd.rc.pitch, mandala.cmd.rc.thr, mandala.cmd.rc.yaw] + // values: [mandala.cmd.rc.roll, mandala.cmd.rc.pitch, mandala.cmd.rc.thr, mandala.cmd.rc.yaw] + values: [] } FcButton { text: "10" - values: [mandala.est.usr.u1, mandala.est.usr.u2, mandala.est.usr.u3, mandala.est.usr.u4, mandala.est.usr.u5, mandala.est.usr.u6] + // values: [mandala.est.usr.u1, mandala.est.usr.u2, mandala.est.usr.u3, mandala.est.usr.u4, mandala.est.usr.u5, mandala.est.usr.u6] + values: [] } TextButton { From 0d5eeb2e8da0c3d60cd833b20c9a00ad82e8b92d Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 1 Apr 2026 13:45:41 +0300 Subject: [PATCH 013/163] Chart addition updated. Fast chart creation added. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 17 +++++++------ .../Tools/FilteredCharts/FcChartsView.qml | 9 +++---- .../FilteredCharts/FcFilterRunningAvg.qml | 25 ++++--------------- .../Tools/FilteredCharts/FcFiltersMenu.qml | 12 ++++----- .../Tools/FilteredCharts/FcMenuChart.qml | 10 +++----- .../Tools/FilteredCharts/FcMenuSet.qml | 7 ++++-- .../Tools/FilteredCharts/FilteredCharts.qml | 5 +++- 7 files changed, 37 insertions(+), 48 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index d6b225b37..a595663d6 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -28,11 +28,17 @@ import Apx.Common TextButton { id: fcBtn + property var values: [] + Layout.fillHeight: true checkable: true ButtonGroup.group: buttonGroup textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor + toolTip: getToolTip(values) + onActivated: fcCharts.facts = Qt.binding(function () { + return values; + }) onPressed: { if (checked) { if (!fcMenuSet.active) { @@ -51,13 +57,6 @@ TextButton { } } - property var values: [] - onActivated: fcCharts.facts = Qt.binding(function () { - return values; - }) - - toolTip: getToolTip(values) - function getToolTip(facts) { var s = []; for (var i = 0; i < facts.length; ++i) { @@ -67,6 +66,10 @@ TextButton { return s.join("
"); } + function callQuickChart() { + fcMenuSet.addNewChart(); + } + FcMenuSet { id: fcMenuSet } diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index c7a95bf3b..ab35567ab 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -67,7 +67,6 @@ Item { anchors.bottomMargin: margin anchors.leftMargin: margin anchors.rightMargin: margin - //onPlotAreaChanged: margin=-plotArea.y/3 plotAreaColor: "black" backgroundColor: "black" @@ -76,7 +75,6 @@ Item { property int samples: Math.min(1000, Math.max(25, width / (3 * speedFactorValue))) property int time: 0 - property bool dataExist: false ValueAxis { @@ -130,7 +128,7 @@ Item { for (var i = 0; i < facts.length; ++i) { appendDataValue(facts[i], t, i); } - //calc scale - reduce + // Calc scale - reduce if ((t - timeRescale) > 21) { timeRescale = t; var d = sdata.length - samples * facts.length; @@ -172,14 +170,14 @@ Item { value = 0; s.append(t, value); sdata.push(value); - //instant rescale - grow + // Instant rescale - grow if (axisY.max < value) { axisY.max = value + dataPadding; } if (axisY.min > value) { axisY.min = value - dataPadding; } - //remove old + // Remove old var cnt = samples; if (s.count > cnt) s.removePoints(0, s.count - cnt); @@ -191,7 +189,6 @@ Item { return openGL; }); s.capStyle = Qt.RoundCap; - //s.opacity=0.7 var color = fact.opts.color; if (!color) diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index 67fe3f057..11090b698 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -28,13 +28,7 @@ Fact { flags: Fact.Group property var data: ({}) - - // Component.onCompleted: { - // load(data); - // updateTitle(); - // updateDescr(); - // mTitle.valueChanged.connect(updateTitle); - // } + property var coef: 0 function load() { for (var i = 0; i < size; ++i) { @@ -63,10 +57,6 @@ Fact { return n; } - function getCoef() { - return raCoef.value; - } - function fillData() { if (typeof value === 'object' && !Array.isArray(value) && value !== null) { data = value; @@ -83,14 +73,9 @@ Fact { value: 0 min: 0 max: 1 - onValueChanged: raFilter.value = value + onValueChanged: { + coef = value; + raFilter.value = value; + } } - - // // Actions - // Fact { - // title: qsTr("Apply") - // flags: (Fact.Action | Fact.Apply) - // icon: "check-circle" - // // onTriggered: save() - // } } diff --git a/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml b/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml index 4b8b7f2c3..acdc00320 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml @@ -25,7 +25,6 @@ import APX.Facts Fact { id: filters - flags: Fact.Group property bool newItem: false @@ -36,10 +35,6 @@ Fact { Component.onCompleted: { fillData(); - // if (value != undefined) - // fType.value = value; - // else - // value = fType.text; // load(data); // updateTitle(); @@ -85,8 +80,13 @@ Fact { } } + // Getting filter data + function getRunningAvgCoef() { + return fRunningAvg.coef; + } + Fact { - id: fType + id: fTypes name: "filters" title: qsTr("Filter") descr: qsTr("Selecting the filter to use") diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 019b015c5..a0e424d7c 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -27,9 +27,9 @@ Fact { // id: number id: mChart flags: Fact.Group + precision: 2 property bool newItem: false - property var data: ({}) signal addTriggered @@ -121,7 +121,6 @@ Fact { // Use filters var v = eval(exp); var type = mFilters.value; - console.log("type = ", type); switch (type) { case "running_avg": useRunningAvgFilter(v); @@ -130,13 +129,12 @@ Fact { } } - // Filters + // Filters functions function useRunningAvgFilter(v) { - var ra = mFilters.fRunningAvg; - var k = ra.getCoef(); + var k = mFilters.getRunningAvgCoef(); value += (v - value) * k; - console.log("use running avg filter", v, "/", value); + // console.log("use running avg filter", v, "/", value); } // Fact { diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 78dc0944f..cd9a61655 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -29,9 +29,7 @@ Fact { title: "Charts #" + fcBtn.text property real speed: msSpeed.value - property var values //from config - property int editorsCnt: 1 signal selected(var num) @@ -64,6 +62,7 @@ Fact { } FcMenuChart { + id: msMenuChart title: qsTr("Add new chart") descr: "Creating and setting a new chart" icon: "plus-circle" @@ -80,6 +79,10 @@ Fact { Component.onCompleted: updateSetItems() + function addNewChart() { + msMenuChart.trigger(); + } + function updateBtnValues() { fcBtn.values = []; for (var i = 0; i < msValues.size; ++i) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 6398bffd9..191d7f517 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -204,7 +204,10 @@ Rectangle { iconName: "plus" toolTip: qsTr("Edit charts") opacity: ui.effects ? (hovered ? 1 : 0.5) : 1 - onTriggered: console.log("Not implemented") + onTriggered: { + var activeButton = buttonGroup.checkedButton; + activeButton.callQuickChart(); + } } property string currentPage: buttonGroup.checkedButton.text From 71dfe0c0c6e3768f89514aee4d75f3757e5eb317 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 1 Apr 2026 19:24:07 +0300 Subject: [PATCH 014/163] Saving chart settings to json. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 4 + .../FilteredCharts/FcFilterRunningAvg.qml | 4 +- .../Tools/FilteredCharts/FcFiltersMenu.qml | 5 +- .../Tools/FilteredCharts/FcMenuChart.qml | 39 ++++---- .../Tools/FilteredCharts/FcMenuSet.qml | 34 +++---- .../Tools/FilteredCharts/FilteredCharts.qml | 88 ++++--------------- 6 files changed, 60 insertions(+), 114 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index a595663d6..ea81f5e75 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -70,6 +70,10 @@ TextButton { fcMenuSet.addNewChart(); } + function getSet() { + return fcMenuSet.save(); + } + FcMenuSet { id: fcMenuSet } diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index 11090b698..1afe940ac 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -36,6 +36,7 @@ Fact { var v = data[settingName(f)]; f.value = v; } + mChart.setChanged(false); } function save() { @@ -66,7 +67,7 @@ Fact { Fact { id: raCoef - name: "running_avg_coef" + name: "coef" title: qsTr("Coefficient") descr: qsTr("Coefficient for filtration") flags: Fact.Float @@ -76,6 +77,7 @@ Fact { onValueChanged: { coef = value; raFilter.value = value; + mChart.setChanged(true); } } } diff --git a/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml b/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml index acdc00320..c2312f543 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml @@ -27,7 +27,6 @@ Fact { id: filters property bool newItem: false - property var data: ({}) signal addTriggered @@ -49,6 +48,7 @@ Fact { var v = data[settingName(f)]; f.value = v; } + mChart.setChanged(false); } function save() { @@ -93,11 +93,12 @@ Fact { flags: Fact.Enum enumStrings: ["none", "running_avg"] onTextChanged: filters.value = text + onValueChanged: mChart.setChanged(true) // combobox index changed } FcFilterRunningAvg { id: fRunningAvg - name: "running_avg_filter" + name: "running_avg" title: qsTr("Running average") descr: qsTr("Running average filter settings") } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index a0e424d7c..376da96e6 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -29,6 +29,7 @@ Fact { flags: Fact.Group precision: 2 + property bool changed: false property bool newItem: false property var data: ({}) @@ -55,6 +56,7 @@ Fact { var v = data[settingName(f)]; f.value = v; } + setChanged(false); } function save() { @@ -129,6 +131,12 @@ Fact { } } + function setChanged(v) { + if (newItem) + return; + changed = v; + } + // Filters functions function useRunningAvgFilter(v) { var k = mFilters.getRunningAvgCoef(); @@ -137,26 +145,13 @@ Fact { // console.log("use running avg filter", v, "/", value); } - // Fact { - // id: mFact - // title: qsTr("Binding") - // descr: qsTr("Fact value") - // flags: Fact.Int - // units: "mandala" - // onTextChanged: { - // if(value){ - // mBind.setValue(text) - // } - // //value=null - // } - // } - Fact { id: mTitle name: "title" title: qsTr("Title") descr: qsTr("Chart name") flags: Fact.Text + onTextChanged: setChanged(true) } Fact { id: mBind @@ -164,6 +159,7 @@ Fact { title: qsTr("Expression") descr: "Math.atan(est.att.pitch/est.att.roll)" flags: Fact.Text + onTextChanged: setChanged(true) } Fact { id: mColor @@ -173,6 +169,7 @@ Fact { flags: Fact.Enum enumStrings: ["red", "orange", "yellow", "green", "aqua", "blue", "purple", "violet"] onTextChanged: setColor() + onValueChanged: setChanged(true) } FcFiltersMenu { id: mFilters @@ -207,15 +204,27 @@ Fact { // Actions Fact { + id: mAdd flags: (Fact.Action | Fact.Apply) title: qsTr("Add") - enabled: (newItem && mBind && mBind.value) ? true : false + enabled: newItem && mBind && mBind.value icon: "plus-circle" onTriggered: { mChart.menuBack(); addTriggered(); } } + Fact { + flags: (Fact.Action | Fact.Apply) + title: qsTr("Save") + enabled: changed && !newItem && !mAdd.enable + icon: "plus-circle" + onTriggered: { + fcControl.saveSets(); + setChanged(false); + } + } + Fact { flags: (Fact.Action | Fact.Remove) title: qsTr("Remove") diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index cd9a61655..8fa7003fb 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -28,6 +28,7 @@ Fact { flags: (Fact.Group | Fact.FlatModel) title: "Charts #" + fcBtn.text + property bool changed: false property real speed: msSpeed.value property var values //from config @@ -42,6 +43,7 @@ Fact { value: chartFact.title onValueChanged: { fcBtn.toolTip = value; + chartFact.title = value; } } @@ -107,7 +109,8 @@ Fact { if (!values) return; var set = {}; - set.title = title; + set.title = msTitle.value; + set.speed = msSpeed.value; set.values = values; return set; } @@ -155,26 +158,11 @@ Fact { } } - // Actions - // Fact { - // flags: (Fact.Action | Fact.Remove) - // title: qsTr("Remove set") - // icon: "delete" - // onTriggered: { - // if (chartFact.active) - // select(0); - // chartFact.destroy(); - // } - // } - - // Fact { - // flags: (Fact.Action | Fact.Apply) - // title: qsTr("Select and save") - // visible: !chartFact.active - // icon: "check-circle" - // onTriggered: { - // chartFact.menuBack(); - // chartFact.selected(chartFact.num); - // } - // } + Fact { + flags: (Fact.Action | Fact.Apply) + title: qsTr("Save") + // visible: changed + icon: "check-circle" + onTriggered: fcControl.saveSets() + } } diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 191d7f517..50f0478ff 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -45,10 +45,24 @@ Rectangle { break; } if (buttonGroup.checkedButton == null) { - buttonGroup.checkedButton = buttonGroup.buttons[0]; //showPage("R") + buttonGroup.checkedButton = buttonGroup.buttons[0]; // check button #1 } } + function saveSets() { + var fjson = application.prefs.loadFile("charts.json"); + var json = fjson ? JSON.parse(fjson) : {}; + json.sets = []; + for (var i = 0; i < buttonGroup.buttons.length; ++i) { + var b = buttonGroup.buttons[i]; + var set = buttonGroup.buttons[i].getSet(); + if (!set) + continue; + json.sets.push(set); + } + application.prefs.saveFile("charts.json", JSON.stringify(json, ' ', 2)); + } + ColumnLayout { id: layout anchors.fill: parent @@ -63,68 +77,6 @@ Rectangle { Layout.preferredHeight: 130 * ui.scale } - TextInput { - id: textInput - - Layout.fillWidth: true - Layout.minimumHeight: Style.fontSize - Layout.rightMargin: Style.spacing - - // clip: true - // focus: true - visible: false - - horizontalAlignment: Text.AlignRight - verticalAlignment: Text.AlignVCenter - - font: apx.font_narrow(Style.fontSize) - - color: activeFocus ? Material.color(Material.Yellow) : Material.primaryTextColor - text: "" - - activeFocusOnTab: true - selectByMouse: true - - onEditingFinished: { - var activeButton = buttonGroup.checkedButton; - if (activeButton) - activeButton.toolTip = textInput.text; - // updateFacts(); - } - onActiveFocusChanged: { - if (activeFocus) - selectAll(); - } - onVisibleChanged: if (visible) - forceActiveFocus() - - Component.onCompleted: updateFacts() - - property var facts: [] - function updateFacts() { - var flist = []; - var list = textInput.text.split(','); - for (var i = 0; i < list.length; ++i) { - var f = list[i]; - var fact = {}; - if (eval(f) == undefined) - continue; - fact.title = f; - fact.name = f; - fact.descr = f; - fact.opts = {}; - fact.opts.color = Material.color(Material.Blue + i * 2); - flist.push(fact); - } - if (JSON.stringify(textInput.facts) == JSON.stringify(flist)) - return; - textInput.facts = flist; - - if (plusButton.checked) - fcCharts.facts = flist; - } - } - ButtonGroup { id: buttonGroup } @@ -143,47 +95,38 @@ Rectangle { } FcButton { text: "2" - // values: [mandala.cmd.att.pitch, mandala.est.att.pitch] values: [] } FcButton { text: "3" - // values: [mandala.cmd.pos.bearing, mandala.cmd.att.yaw, mandala.est.att.yaw] values: [] } FcButton { text: "4" - // values: [mandala.est.acc.x, mandala.est.acc.y] values: [] } FcButton { text: "5" - // values: [mandala.est.acc.z] values: [] } FcButton { text: "6" - // values: [mandala.est.gyro.x, mandala.est.gyro.y, mandala.est.gyro.z] values: [] } FcButton { text: "7" - // values: [mandala.est.pos.altitude, mandala.est.pos.vspeed, mandala.est.air.airspeed] values: [] } FcButton { text: "8" - // values: [mandala.ctr.att.ail, mandala.ctr.att.elv, mandala.ctr.att.rud, mandala.ctr.eng.thr, mandala.ctr.eng.prop, mandala.ctr.str.rud] values: [] } FcButton { text: "9" - // values: [mandala.cmd.rc.roll, mandala.cmd.rc.pitch, mandala.cmd.rc.thr, mandala.cmd.rc.yaw] values: [] } FcButton { text: "10" - // values: [mandala.est.usr.u1, mandala.est.usr.u2, mandala.est.usr.u3, mandala.est.usr.u4, mandala.est.usr.u5, mandala.est.usr.u6] values: [] } @@ -215,6 +158,5 @@ Rectangle { Settings { category: "filtredCharts" property alias page: fcControl.currentPage - property alias custom: textInput.text } } From cb6b48e4f04c6bc62d1a27e2b9d3f396c61f5515 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 1 Apr 2026 20:31:30 +0300 Subject: [PATCH 015/163] Read settings from json implemented. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 4 +++ .../Tools/FilteredCharts/FcMenuChart.qml | 2 +- .../Tools/FilteredCharts/FcMenuSet.qml | 9 ++++++- .../Tools/FilteredCharts/FilteredCharts.qml | 25 ++++++++++++++++++- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index ea81f5e75..ee22a70de 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -74,6 +74,10 @@ TextButton { return fcMenuSet.save(); } + function loadSet(set) { + fcMenuSet.load(set); + } + FcMenuSet { id: fcMenuSet } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 376da96e6..7abb36d2b 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -220,7 +220,7 @@ Fact { enabled: changed && !newItem && !mAdd.enable icon: "plus-circle" onTriggered: { - fcControl.saveSets(); + fcControl.saveSettings(); setChanged(false); } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 8fa7003fb..93739785e 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -115,6 +115,13 @@ Fact { return set; } + function load(set) { + msTitle.value = set.title; + msSpeed.value = set.speed; + values = set.values; + updateSetItems(); + } + function updateSetItems() { // msValues.onSizeChanged.disconnect(updateDescr); msValues.deleteChildren(); @@ -163,6 +170,6 @@ Fact { title: qsTr("Save") // visible: changed icon: "check-circle" - onTriggered: fcControl.saveSets() + onTriggered: fcControl.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 50f0478ff..a09d31db0 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -47,9 +47,10 @@ Rectangle { if (buttonGroup.checkedButton == null) { buttonGroup.checkedButton = buttonGroup.buttons[0]; // check button #1 } + loadSettings(); } - function saveSets() { + function saveSettings() { var fjson = application.prefs.loadFile("charts.json"); var json = fjson ? JSON.parse(fjson) : {}; json.sets = []; @@ -63,6 +64,28 @@ Rectangle { application.prefs.saveFile("charts.json", JSON.stringify(json, ' ', 2)); } + function loadSettings() { + var sets = []; + var fjson = application.prefs.loadFile("charts.json"); + var json = fjson ? JSON.parse(fjson) : {}; + var set = {}; + if (json && json.sets) { + for (var i in json.sets) { + set = json.sets[i]; + if (!(typeof set === 'object' && !Array.isArray(set) && set !== null)) + continue; + sets.push(set); + } + } + if (sets.length <= 0) + return; + + // Create charts + for (var i in sets) { + buttonGroup.buttons[i].loadSet(sets[i]); + } + } + ColumnLayout { id: layout anchors.fill: parent From 9b700a8d647db80be0e456ca68bd19ea89269fdb Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 2 Apr 2026 15:19:37 +0300 Subject: [PATCH 016/163] Charts menu saving. --- .../Tools/FilteredCharts/FcMenuSet.qml | 102 +++++++++--------- 1 file changed, 50 insertions(+), 52 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 93739785e..50b2fa3fb 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -32,55 +32,6 @@ Fact { property real speed: msSpeed.value property var values //from config - signal selected(var num) - - Fact { - id: msTitle - title: qsTr("Title") - descr: qsTr("Charts title") - flags: Fact.Text - icon: "rename-box" - value: chartFact.title - onValueChanged: { - fcBtn.toolTip = value; - chartFact.title = value; - } - } - - Fact { - id: msSpeed - title: qsTr("Speed") - descr: qsTr("Charts speed") - flags: Fact.Float - icon: "speedometer" - value: 1.0 - precision: 1 - min: 0.2 - max: 4 - onValueChanged: { - fcCharts.speed = value; - fcCharts.speedFactorValue = value; - } - } - - FcMenuChart { - id: msMenuChart - title: qsTr("Add new chart") - descr: "Creating and setting a new chart" - icon: "plus-circle" - newItem: true - onAddTriggered: createChart(save()) - } - - Fact { - id: msValues - title: qsTr("Values") - flags: (Fact.Group | Fact.Section | Fact.DragChildren) - onSizeChanged: updateBtnValues() - } - - Component.onCompleted: updateSetItems() - function addNewChart() { msMenuChart.trigger(); } @@ -99,6 +50,7 @@ Fact { } function save() { + changed = false; var values = []; for (var i = 0; i < msValues.size; ++i) { var mchart = msValues.child(i).save(); @@ -106,8 +58,6 @@ Fact { continue; values.push(mchart); } - if (!values) - return; var set = {}; set.title = msTitle.value; set.speed = msSpeed.value; @@ -120,6 +70,7 @@ Fact { msSpeed.value = set.speed; values = set.values; updateSetItems(); + changed = false; } function updateSetItems() { @@ -165,10 +116,57 @@ Fact { } } + Fact { + id: msTitle + title: qsTr("Title") + descr: qsTr("Charts title") + flags: Fact.Text + icon: "rename-box" + value: chartFact.title + onValueChanged: { + fcBtn.toolTip = value; + chartFact.title = value; + changed = true; + } + } + + Fact { + id: msSpeed + title: qsTr("Speed") + descr: qsTr("Charts speed") + flags: Fact.Float + icon: "speedometer" + value: 1.0 + precision: 1 + min: 0.2 + max: 4 + onValueChanged: { + fcCharts.speed = value; + fcCharts.speedFactorValue = value; + changed = true; + } + } + + FcMenuChart { + id: msMenuChart + title: qsTr("Add new chart") + descr: "Creating and setting a new chart" + icon: "plus-circle" + newItem: true + onAddTriggered: createChart(save()) + } + + Fact { + id: msValues + title: qsTr("Values") + flags: (Fact.Group | Fact.Section | Fact.DragChildren) + onSizeChanged: updateBtnValues() + } + Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - // visible: changed + visible: changed icon: "check-circle" onTriggered: fcControl.saveSettings() } From d9264e065e2a10b5e65fcd9ec55408ac819ad8e0 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 2 Apr 2026 22:07:16 +0300 Subject: [PATCH 017/163] Sets saving updated. --- .../FilteredCharts/FcFilterRunningAvg.qml | 17 +++++++-- .../Tools/FilteredCharts/FcMenuChart.qml | 36 +++++++------------ .../{FcFiltersMenu.qml => FcMenuFilters.qml} | 29 +++++++++------ .../Tools/FilteredCharts/FcMenuSet.qml | 18 +++++----- 4 files changed, 54 insertions(+), 46 deletions(-) rename src/Plugins/Tools/FilteredCharts/{FcFiltersMenu.qml => FcMenuFilters.qml} (81%) diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index 1afe940ac..1dee5ebca 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -27,16 +27,19 @@ Fact { id: raFilter flags: Fact.Group + property bool changes: false property var data: ({}) property var coef: 0 + onChangesChanged: { if(changes) fMenu.changes = true;} + function load() { for (var i = 0; i < size; ++i) { var f = child(i); var v = data[settingName(f)]; f.value = v; } - mChart.setChanged(false); + changes = false; } function save() { @@ -48,6 +51,7 @@ Fact { continue; data[settingName(f)] = s; } + changes = false; return data; } @@ -77,7 +81,16 @@ Fact { onValueChanged: { coef = value; raFilter.value = value; - mChart.setChanged(true); + changes = true; } } + + // Actions + Fact { + flags: (Fact.Action | Fact.Apply) + title: qsTr("Save") + enabled: !mChart.newItem && changes + icon: "check-circle" + onTriggered: fcControl.saveSettings(); + } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 7abb36d2b..03a669a29 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -29,7 +29,7 @@ Fact { flags: Fact.Group precision: 2 - property bool changed: false + property bool changes: false property bool newItem: false property var data: ({}) @@ -46,17 +46,14 @@ Fact { mColor.valueChanged.connect(updateDescr); } - function updateFilters() { - mFilters.fillFilters(); - } - function load() { for (var i = 0; i < mChart.size; ++i) { var f = child(i); var v = data[settingName(f)]; f.value = v; } - setChanged(false); + mFilters.fillData() + changes = false; } function save() { @@ -72,6 +69,7 @@ Fact { } data[settingName(f)] = s; } + changes = false; return data; } @@ -131,17 +129,10 @@ Fact { } } - function setChanged(v) { - if (newItem) - return; - changed = v; - } - // Filters functions function useRunningAvgFilter(v) { var k = mFilters.getRunningAvgCoef(); value += (v - value) * k; - // console.log("use running avg filter", v, "/", value); } @@ -151,7 +142,8 @@ Fact { title: qsTr("Title") descr: qsTr("Chart name") flags: Fact.Text - onTextChanged: setChanged(true) + onTextChanged: changes = true + } Fact { id: mBind @@ -159,7 +151,7 @@ Fact { title: qsTr("Expression") descr: "Math.atan(est.att.pitch/est.att.roll)" flags: Fact.Text - onTextChanged: setChanged(true) + onTextChanged: changes = true } Fact { id: mColor @@ -169,9 +161,9 @@ Fact { flags: Fact.Enum enumStrings: ["red", "orange", "yellow", "green", "aqua", "blue", "purple", "violet"] onTextChanged: setColor() - onValueChanged: setChanged(true) + onValueChanged: changes = true } - FcFiltersMenu { + FcMenuFilters { id: mFilters name: "filt" title: qsTr("Filters") @@ -217,14 +209,10 @@ Fact { Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - enabled: changed && !newItem && !mAdd.enable - icon: "plus-circle" - onTriggered: { - fcControl.saveSettings(); - setChanged(false); - } + enabled: !newItem && !mAdd.enable && changes + icon: "check-circle" + onTriggered: fcControl.saveSettings(); } - Fact { flags: (Fact.Action | Fact.Remove) title: qsTr("Remove") diff --git a/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml b/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml similarity index 81% rename from src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml rename to src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml index c2312f543..de8f17f81 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFiltersMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml @@ -24,31 +24,28 @@ import QtQuick import APX.Facts Fact { - id: filters + id: fMenu - property bool newItem: false + property bool changes: false property var data: ({}) - signal addTriggered signal removeTriggered - Component.onCompleted: { - fillData(); + onChangesChanged: { if(changes) mChart.changes = true;} - // load(data); + Component.onCompleted: { // updateTitle(); // updateDescr(); // mTitle.valueChanged.connect(updateTitle); } function load() { - console.log(); for (var i = 0; i < size; ++i) { var f = child(i); var v = data[settingName(f)]; f.value = v; } - mChart.setChanged(false); + changes = false; } function save() { @@ -62,6 +59,7 @@ Fact { continue; data[settingName(f)] = s; } + changes = false; return data; } @@ -77,6 +75,7 @@ Fact { data = value; load(); fRunningAvg.fillData(); + changes = false; } } @@ -92,14 +91,22 @@ Fact { descr: qsTr("Selecting the filter to use") flags: Fact.Enum enumStrings: ["none", "running_avg"] - onTextChanged: filters.value = text - onValueChanged: mChart.setChanged(true) // combobox index changed + onTextChanged: fMenu.value = text + onValueChanged: changes = true // combobox index changed } - FcFilterRunningAvg { id: fRunningAvg name: "running_avg" title: qsTr("Running average") descr: qsTr("Running average filter settings") } + + // Actions + Fact { + flags: (Fact.Action | Fact.Apply) + title: qsTr("Save") + enabled: !mChart.newItem && changes + icon: "check-circle" + onTriggered: fcControl.saveSettings(); + } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 50b2fa3fb..83ea0e675 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -28,7 +28,7 @@ Fact { flags: (Fact.Group | Fact.FlatModel) title: "Charts #" + fcBtn.text - property bool changed: false + property bool changes: false property real speed: msSpeed.value property var values //from config @@ -70,7 +70,7 @@ Fact { msSpeed.value = set.speed; values = set.values; updateSetItems(); - changed = false; + changes = false; } function updateSetItems() { @@ -91,6 +91,8 @@ Fact { var c = createFact(msValues, "FcMenuChart.qml", { "data": mchart }); + c.removeTriggered.connect(function(){changes = true}); + changes = true; // c.titleChanged.connect(updateDescr); // c.removeTriggered.connect(updateDescr); @@ -116,7 +118,7 @@ Fact { } } - Fact { + Fact { id: msTitle title: qsTr("Title") descr: qsTr("Charts title") @@ -126,10 +128,9 @@ Fact { onValueChanged: { fcBtn.toolTip = value; chartFact.title = value; - changed = true; + changes = true; } } - Fact { id: msSpeed title: qsTr("Speed") @@ -143,10 +144,9 @@ Fact { onValueChanged: { fcCharts.speed = value; fcCharts.speedFactorValue = value; - changed = true; + changes = true; } } - FcMenuChart { id: msMenuChart title: qsTr("Add new chart") @@ -155,7 +155,6 @@ Fact { newItem: true onAddTriggered: createChart(save()) } - Fact { id: msValues title: qsTr("Values") @@ -163,10 +162,11 @@ Fact { onSizeChanged: updateBtnValues() } + // Actions Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - visible: changed + visible: changes icon: "check-circle" onTriggered: fcControl.saveSettings() } From 5cf415b47d3eb8e2e464e841ea0ad841612607c5 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 3 Apr 2026 01:45:55 +0300 Subject: [PATCH 018/163] Charts menu set save fix. --- src/Plugins/Tools/FilteredCharts/FcMenuSet.qml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 83ea0e675..b77effa17 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -50,7 +50,7 @@ Fact { } function save() { - changed = false; + changes = false; var values = []; for (var i = 0; i < msValues.size; ++i) { var mchart = msValues.child(i).save(); @@ -91,7 +91,9 @@ Fact { var c = createFact(msValues, "FcMenuChart.qml", { "data": mchart }); - c.removeTriggered.connect(function(){changes = true}); + c.removeTriggered.connect(function () { + changes = true; + }); changes = true; // c.titleChanged.connect(updateDescr); From c27f921c9f8343d1a05a97df476100420bfce42a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 3 Apr 2026 02:34:22 +0300 Subject: [PATCH 019/163] Description update and refactoring. --- .vscode/settings.json | 2 +- src/Plugins/Tools/FilteredCharts/FcButton.qml | 6 ++---- .../Tools/FilteredCharts/FcChartsView.qml | 4 +--- .../FilteredCharts/FcFilterRunningAvg.qml | 7 ++++--- .../Tools/FilteredCharts/FcMenuChart.qml | 8 ++++---- .../Tools/FilteredCharts/FcMenuFilters.qml | 9 ++------- src/Plugins/Tools/FilteredCharts/FcMenuSet.qml | 18 +----------------- .../Tools/FilteredCharts/FilteredCharts.qml | 6 ++---- 8 files changed, 17 insertions(+), 43 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 52f6eea6c..7d351970f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { "editor.formatOnType": true, - "editor.formatOnSave": true, + "editor.formatOnSave": false, "files.insertFinalNewline": true, "cmake.buildDirectory": "${workspaceFolder}/build", // "cmake.buildTask": true, diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index ee22a70de..e7a45de18 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -36,9 +36,7 @@ TextButton { textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor toolTip: getToolTip(values) - onActivated: fcCharts.facts = Qt.binding(function () { - return values; - }) + onActivated: fcCharts.facts = Qt.binding(function () { return values;}) onPressed: { if (checked) { if (!fcMenuSet.active) { @@ -52,7 +50,7 @@ TextButton { Connections { target: apx.fleet.current.mandala function onTelemetryDecoded() { - if (checked) + if (checked) // Comment it to calculate all values ​​at once fcMenuSet.updateChartsValues(); } } diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index ab35567ab..f9210e900 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -40,9 +40,7 @@ Item { // property real speedFactorValue: speed < 0 ? speedFactor[0] : speed >= speedFactor.length ? speedFactor[speedFactor.length - 1] : speedFactor[speed] property real speedFactorValue: 1 - onFactsChanged: { - fcChartView.reset(); - } + onFactsChanged: fcChartView.reset() Connections { target: apx.fleet.current.mandala diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index 1dee5ebca..a31569acd 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -25,13 +25,14 @@ import APX.Facts Fact { id: raFilter + flags: Fact.Group property bool changes: false property var data: ({}) property var coef: 0 - onChangesChanged: { if(changes) fMenu.changes = true;} + onChangesChanged: { if (changes) fMenu.changes = true;} function load() { for (var i = 0; i < size; ++i) { @@ -80,7 +81,7 @@ Fact { max: 1 onValueChanged: { coef = value; - raFilter.value = value; + raFilter.value = "k=" + value; changes = true; } } @@ -91,6 +92,6 @@ Fact { title: qsTr("Save") enabled: !mChart.newItem && changes icon: "check-circle" - onTriggered: fcControl.saveSettings(); + onTriggered: fcControl.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 03a669a29..b24c2c4bc 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -24,8 +24,8 @@ import QtQuick import APX.Facts Fact { - // id: number id: mChart + flags: Fact.Group precision: 2 @@ -44,6 +44,7 @@ Fact { mTitle.valueChanged.connect(updateTitle); mBind.valueChanged.connect(updateDescr); mColor.valueChanged.connect(updateDescr); + mFilters.valueChanged.connect(updateDescr); } function load() { @@ -52,7 +53,7 @@ Fact { var v = data[settingName(f)]; f.value = v; } - mFilters.fillData() + mFilters.fillData(); changes = false; } @@ -143,7 +144,6 @@ Fact { descr: qsTr("Chart name") flags: Fact.Text onTextChanged: changes = true - } Fact { id: mBind @@ -211,7 +211,7 @@ Fact { title: qsTr("Save") enabled: !newItem && !mAdd.enable && changes icon: "check-circle" - onTriggered: fcControl.saveSettings(); + onTriggered: fcControl.saveSettings() } Fact { flags: (Fact.Action | Fact.Remove) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml index de8f17f81..f84a92df7 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml @@ -31,13 +31,8 @@ Fact { signal removeTriggered - onChangesChanged: { if(changes) mChart.changes = true;} + onChangesChanged: { if (changes) mChart.changes = true;} - Component.onCompleted: { - // updateTitle(); - // updateDescr(); - // mTitle.valueChanged.connect(updateTitle); - } function load() { for (var i = 0; i < size; ++i) { @@ -107,6 +102,6 @@ Fact { title: qsTr("Save") enabled: !mChart.newItem && changes icon: "check-circle" - onTriggered: fcControl.saveSettings(); + onTriggered: fcControl.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index b77effa17..be22f8c12 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -25,6 +25,7 @@ import APX.Facts Fact { id: chartFact + flags: (Fact.Group | Fact.FlatModel) title: "Charts #" + fcBtn.text @@ -74,13 +75,10 @@ Fact { } function updateSetItems() { - // msValues.onSizeChanged.disconnect(updateDescr); msValues.deleteChildren(); for (var i in values) { createChart(values[i]); } - // updateDescr(); - // msValues.onSizeChanged.connect(updateDescr); } function createChart(mchart) { @@ -95,22 +93,8 @@ Fact { changes = true; }); changes = true; - - // c.titleChanged.connect(updateDescr); - // c.removeTriggered.connect(updateDescr); } - // function updateDescr() { - // if (!chartFact) - // return; - // descr = ""; - // var s = []; - // for (var i = 0; i < msValues.size; ++i) { - // s.push(msValues.child(i).title); - // } - // descr = s.join(','); - // } - function createFact(parent, url, opts) { var component = Qt.createComponent(url); if (component.status === Component.Ready) { diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index a09d31db0..2511902d5 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -32,7 +32,6 @@ Rectangle { implicitHeight: layout.implicitHeight implicitWidth: layout.implicitWidth - border.width: 0 color: "#000" @@ -77,9 +76,9 @@ Rectangle { sets.push(set); } } - if (sets.length <= 0) + if (sets.length <= 0) { return; - + } // Create charts for (var i in sets) { buttonGroup.buttons[i].loadSet(sets[i]); @@ -113,7 +112,6 @@ Rectangle { FcButton { text: "1" checked: true - // values: [mandala.cmd.att.roll, mandala.est.att.roll] values: [] } FcButton { From a9b48a4e16b29e3cdd729f82a44cfb5e3e04ac90 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 3 Apr 2026 03:29:33 +0300 Subject: [PATCH 020/163] Charts speed for good looking was fixed. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 2 +- src/Plugins/Tools/FilteredCharts/FcChartsView.qml | 14 ++------------ src/Plugins/Tools/FilteredCharts/FcMenuSet.qml | 1 - 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index e7a45de18..d6f4acecf 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -43,7 +43,7 @@ TextButton { fcMenuSet.trigger(); } } else { - fcCharts.speedFactorValue = fcMenuSet.speed; + fcCharts.speed = fcMenuSet.speed; } } diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index f9210e900..39ec9c48c 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -32,12 +32,10 @@ Item { property bool openGL: false //apx.settings.graphics.opengl.value property bool smoothLines: ui.smooth - property real speed: 0 property real lineWidth: ui.antialiasing ? 1.5 : 1 property real lineWidthCmd: ui.antialiasing ? 2.1 : 2 - // property var speedFactor: [1, 2, 4, 0.5, 0.2] - // property real speedFactorValue: speed < 0 ? speedFactor[0] : speed >= speedFactor.length ? speedFactor[speedFactor.length - 1] : speedFactor[speed] + property real speed: 1 property real speedFactorValue: 1 onFactsChanged: fcChartView.reset() @@ -116,7 +114,7 @@ Item { axisY.max = dataPaddingZero; axisY.tickCount = 4; axisY.applyNiceNumbers(); - speed = 0; + speedFactorValue = speed; } function appendData() { @@ -206,12 +204,4 @@ Item { return s; } } - - // function changeSpeed() { - // if ((speed + 1) < speedFactor.length) - // speed += 1; - // else - // speed = 0; - // //console.log(speed) - // } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index be22f8c12..292fae7c0 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -128,7 +128,6 @@ Fact { min: 0.2 max: 4 onValueChanged: { - fcCharts.speed = value; fcCharts.speedFactorValue = value; changes = true; } From 5ccac8c496514b251105e61830b0397b8d3ab472 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 3 Apr 2026 04:17:02 +0300 Subject: [PATCH 021/163] =?UTF-8?q?=D0=A1olorization=20for=20chart=20toolt?= =?UTF-8?q?ips=20added.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 10 +++++----- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 2 ++ src/Plugins/Tools/FilteredCharts/FcMenuSet.qml | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index d6f4acecf..1c6ddbff6 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -34,7 +34,6 @@ TextButton { checkable: true ButtonGroup.group: buttonGroup textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor - toolTip: getToolTip(values) onActivated: fcCharts.facts = Qt.binding(function () { return values;}) onPressed: { @@ -55,13 +54,14 @@ TextButton { } } - function getToolTip(facts) { - var s = []; + function updateToolTip(facts) { + var s = []; + s.push("" + fcMenuSet.title + ""); for (var i = 0; i < facts.length; ++i) { var fact = facts[i]; - s.push("" + fact.descr + ""); + s.push("" + fact.title + ""); } - return s.join("
"); + toolTip = s.join("
"); } function callQuickChart() { diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index b24c2c4bc..a416d66fc 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -85,6 +85,7 @@ Fact { if (newItem) return; title = mTitle.text ? mTitle.text : mBind.text; + chartFact.updateBtnValues() } function updateDescr() { @@ -113,6 +114,7 @@ Fact { var opt = mChart.opts; opt.color = mColor.text; mChart.opts = opt; + chartFact.updateBtnValues() } function updateValue() { diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 292fae7c0..db585411d 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -41,6 +41,7 @@ Fact { fcBtn.values = []; for (var i = 0; i < msValues.size; ++i) fcBtn.values.push(msValues.child(i)); + fcBtn.updateToolTip(fcBtn.values); } function updateChartsValues() { @@ -112,9 +113,9 @@ Fact { icon: "rename-box" value: chartFact.title onValueChanged: { - fcBtn.toolTip = value; chartFact.title = value; changes = true; + updateBtnValues() } } Fact { From 57691827988eda8e7d39ad5efc04359738122cc9 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 3 Apr 2026 06:23:17 +0300 Subject: [PATCH 022/163] Expression parsing errors processing added. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 5 +++ .../Tools/FilteredCharts/FcMenuChart.qml | 33 ++++++++++++------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index 1c6ddbff6..d83a7db50 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -76,6 +76,11 @@ TextButton { fcMenuSet.load(set); } + Timer { + id: timer + interval: 10000 + } + FcMenuSet { id: fcMenuSet } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index a416d66fc..8c47a5f27 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -118,20 +118,31 @@ Fact { } function updateValue() { - var exp = mBind.text; - if (eval(exp) == undefined) - return; - // Use filters - var v = eval(exp); - var type = mFilters.value; - switch (type) { - case "running_avg": - useRunningAvgFilter(v); - default: - value = v; + var expr = mBind.text; + try { + var v = new Function('return ' + expr)() + if (v === undefined) + throw new Error("expression is undefined") + // Use filters + var type = mFilters.value; + switch (type) { + case "running_avg": + useRunningAvgFilter(v); + default: + value = v; + } + } catch (e) { + chartWarning(e.message); } } + function chartWarning(msg) { + if(timer.running) + return; + console.warn("Chart " + title + ": " + msg); + timer.restart(); + } + // Filters functions function useRunningAvgFilter(v) { var k = mFilters.getRunningAvgCoef(); From 30607af38fc03a4839d56dbdaeb1ed6bec53416c Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 3 Apr 2026 21:04:28 +0300 Subject: [PATCH 023/163] Color chooser implemented. --- .../Tools/FilteredCharts/FcColorChooser.qml | 60 +++++++++++++++++++ .../Tools/FilteredCharts/FcMenuChart.qml | 23 +++++-- 2 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 src/Plugins/Tools/FilteredCharts/FcColorChooser.qml diff --git a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml new file mode 100644 index 000000000..372210de1 --- /dev/null +++ b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml @@ -0,0 +1,60 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls + +import Apx.Common +import APX.Facts + +Rectangle { + id: colorBox + border.width: 0 + color: "#282828" + implicitWidth: 420 + implicitHeight: 95 + // implicitHeight: 120 + + property var chartColor: "white" + + GridLayout { + columns: 8 + // columns: 12 + anchors.fill: parent + anchors.margins: Style.spacing * 1.2 + columnSpacing: Style.spacing * 1.2 + rowSpacing: Style.spacing * 1.2 + + Repeater { + model: [ + "#ca2626", "#d69436", "#d6c544", "#74bf2f", "#6086af", "#926b8e", "#c59c5d", "#ffffff", + "#ad0000", "#d06600", "#c9b300", "#61B218", "#2f568b", "#634568", "#a36914", "#b2b6af", + "#8b0000", "#ae4e00", "#a68700", "#43820c", "#1f4072", "#4e3057", "#794c08", "#9da09a" + ] + + // model: ["#ff0000", "#dc143c", "#ff6347", "#ff7f50", "#ff4500", "#ff1493", "#ff69b4", "#db7093", + // "#ff8c00", "#ffa500", "#ffd700", "#ffff00", "#ffffe0", "#fffacd", "#eee8aa", "#f0e68c", + // "#008000", "#00ff00", "#32cd32", "#98fb98", "#00fa9a", "#2e8b57", "#6b8e23", "#556b2f", + // "#0000ff", "#0000cd", "#1e90ff", "#00bfff", "#87ceeb", "#add8e6", "#4682b4", "#000080", + // "#800080", "#8a2be2", "#9400d3", "#9932cc", "#ba55d3", "#d8bfd8", "#dda0dd", "#ee82ee", + // "#a52a2a", "#d2691e", "#deb887", "#ffffff", "#f5f5f5", "#dcdcdc", "#808080", "#000000"] + + delegate: Rectangle { + property var chosen: mouseArea.containsMouse + Layout.fillWidth: true + Layout.fillHeight: true + radius: height/12 + color: modelData + border.width: ui.scale >= 1 ? ui.scale : 1 + border.color: chosen ? "lightblue" : "transparent" + opacity: chosen ? 1 : 0.8 + scale: chosen ? 1.1 : 1.0 + + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: fact.setValue(modelData); + } + } + } + } +} diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 8c47a5f27..e43e2e661 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -22,6 +22,7 @@ import QtQuick import APX.Facts +import Apx.Common Fact { id: mChart @@ -171,10 +172,24 @@ Fact { name: "color" title: qsTr("Color") descr: qsTr("Chart color") - flags: Fact.Enum - enumStrings: ["red", "orange", "yellow", "green", "aqua", "blue", "purple", "violet"] - onTextChanged: setColor() - onValueChanged: changes = true + value: "#ff0000" + onValueChanged: { + setColor() + changes = true + } + Component.onCompleted: { + var opt = opts; + opt.page = "qrc:/FilteredCharts/FcColorChooser.qml"; + opts = opt; + } + Fact { + id: mApply + flags: (Fact.Action | Fact.Apply) + title: qsTr("Save") + enabled: !newItem && changes + icon: "check-circle" + onTriggered: fcControl.saveSettings() + } } FcMenuFilters { id: mFilters From 4480726a5ff16797348f50867191baacb9abe410 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 5 Apr 2026 00:19:15 +0300 Subject: [PATCH 024/163] Color chooser color replaced. --- .../Tools/FilteredCharts/FcColorChooser.qml | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml index 372210de1..1c4746df3 100644 --- a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml +++ b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml @@ -16,27 +16,27 @@ Rectangle { property var chartColor: "white" GridLayout { - columns: 8 - // columns: 12 + // columns: 8 + columns: 12 anchors.fill: parent anchors.margins: Style.spacing * 1.2 columnSpacing: Style.spacing * 1.2 rowSpacing: Style.spacing * 1.2 Repeater { - model: [ - "#ca2626", "#d69436", "#d6c544", "#74bf2f", "#6086af", "#926b8e", "#c59c5d", "#ffffff", - "#ad0000", "#d06600", "#c9b300", "#61B218", "#2f568b", "#634568", "#a36914", "#b2b6af", - "#8b0000", "#ae4e00", "#a68700", "#43820c", "#1f4072", "#4e3057", "#794c08", "#9da09a" + // model: [ + // "#ca2626", "#d69436", "#d6c544", "#74bf2f", "#6086af", "#926b8e", "#c59c5d", "#ffffff", + // "#ad0000", "#d06600", "#c9b300", "#61B218", "#2f568b", "#634568", "#a36914", "#b2b6af", + // "#8b0000", "#ae4e00", "#a68700", "#43820c", "#1f4072", "#4e3057", "#794c08", "#9da09a", + // ] + + model: [ // m.b. change: "#eee8aa", "#f0e68c", "#fffacd", "#ffffe0"(in yellow, orange), "#00fa9a"(in olive), "#dcdcdc"(in brown), "#f5f5f5"(in black) + "#ff7f50", "#db7093", "#f0e68c", "#fffacd", "#98fb98", "#00fa9a", "#add8e6", "#4682b4", "#9932cc", "#d8bfd8", "#dcdcdc", "#ffffff", + "#ff6347", "#ff69b4", "#eee8aa", "#ffffe0", "#00ff00", "#6b8e23", "#87ceeb", "#0000ff", "#8a2be2", "#dda0dd", "#deb887", "#f5f5f5", + "#ff4500", "#ff1493", "#ffa500", "#ffff00", "#32cd32", "#556b2f", "#00bfff", "#0000cd", "#9400d3", "#ee82ee", "#d2691e", "#808080", + "#ff0000", "#dc143c", "#ff8c00", "#ffd700", "#008000", '#122c1d', "#1e90ff", "#000080", "#800080", "#ba55d3", "#a52a2a", "#000000" ] - // model: ["#ff0000", "#dc143c", "#ff6347", "#ff7f50", "#ff4500", "#ff1493", "#ff69b4", "#db7093", - // "#ff8c00", "#ffa500", "#ffd700", "#ffff00", "#ffffe0", "#fffacd", "#eee8aa", "#f0e68c", - // "#008000", "#00ff00", "#32cd32", "#98fb98", "#00fa9a", "#2e8b57", "#6b8e23", "#556b2f", - // "#0000ff", "#0000cd", "#1e90ff", "#00bfff", "#87ceeb", "#add8e6", "#4682b4", "#000080", - // "#800080", "#8a2be2", "#9400d3", "#9932cc", "#ba55d3", "#d8bfd8", "#dda0dd", "#ee82ee", - // "#a52a2a", "#d2691e", "#deb887", "#ffffff", "#f5f5f5", "#dcdcdc", "#808080", "#000000"] - delegate: Rectangle { property var chosen: mouseArea.containsMouse Layout.fillWidth: true From 603cffb688f41c09439426d7e38d4a55666639d3 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 5 Apr 2026 01:57:13 +0300 Subject: [PATCH 025/163] Color chooser scale added. --- .../Tools/FilteredCharts/FcColorChooser.qml | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml index 1c4746df3..5ccbbc31a 100644 --- a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml +++ b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml @@ -9,27 +9,21 @@ Rectangle { id: colorBox border.width: 0 color: "#282828" - implicitWidth: 420 - implicitHeight: 95 - // implicitHeight: 120 + implicitWidth: 280 * ui.scale + implicitHeight: 80 * ui.scale + // implicitHeight: 64 * ui.scale property var chartColor: "white" GridLayout { - // columns: 8 columns: 12 anchors.fill: parent anchors.margins: Style.spacing * 1.2 columnSpacing: Style.spacing * 1.2 rowSpacing: Style.spacing * 1.2 + // columns: 8 Repeater { - // model: [ - // "#ca2626", "#d69436", "#d6c544", "#74bf2f", "#6086af", "#926b8e", "#c59c5d", "#ffffff", - // "#ad0000", "#d06600", "#c9b300", "#61B218", "#2f568b", "#634568", "#a36914", "#b2b6af", - // "#8b0000", "#ae4e00", "#a68700", "#43820c", "#1f4072", "#4e3057", "#794c08", "#9da09a", - // ] - model: [ // m.b. change: "#eee8aa", "#f0e68c", "#fffacd", "#ffffe0"(in yellow, orange), "#00fa9a"(in olive), "#dcdcdc"(in brown), "#f5f5f5"(in black) "#ff7f50", "#db7093", "#f0e68c", "#fffacd", "#98fb98", "#00fa9a", "#add8e6", "#4682b4", "#9932cc", "#d8bfd8", "#dcdcdc", "#ffffff", "#ff6347", "#ff69b4", "#eee8aa", "#ffffe0", "#00ff00", "#6b8e23", "#87ceeb", "#0000ff", "#8a2be2", "#dda0dd", "#deb887", "#f5f5f5", @@ -37,11 +31,17 @@ Rectangle { "#ff0000", "#dc143c", "#ff8c00", "#ffd700", "#008000", '#122c1d', "#1e90ff", "#000080", "#800080", "#ba55d3", "#a52a2a", "#000000" ] + // model: [ + // "#ca2626", "#d69436", "#d6c544", "#74bf2f", "#6086af", "#926b8e", "#c59c5d", "#ffffff", + // "#ad0000", "#d06600", "#c9b300", "#61B218", "#2f568b", "#634568", "#a36914", "#b2b6af", + // "#8b0000", "#ae4e00", "#a68700", "#43820c", "#1f4072", "#4e3057", "#794c08", "#9da09a", + // ] + delegate: Rectangle { property var chosen: mouseArea.containsMouse Layout.fillWidth: true Layout.fillHeight: true - radius: height/12 + // radius: height/12 color: modelData border.width: ui.scale >= 1 ? ui.scale : 1 border.color: chosen ? "lightblue" : "transparent" @@ -52,7 +52,7 @@ Rectangle { id: mouseArea anchors.fill: parent hoverEnabled: true - onClicked: fact.setValue(modelData); + onClicked: fact.value = modelData; } } } From 6fb94c57d3c40b4cdad590f8335747d01ef703a7 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 5 Apr 2026 03:47:42 +0300 Subject: [PATCH 026/163] Update vahrts data only when save. --- .../FilteredCharts/FcFilterRunningAvg.qml | 10 +++++--- .../Tools/FilteredCharts/FcMenuChart.qml | 24 +++++++++++-------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index a31569acd..03b01dbcf 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -40,7 +40,7 @@ Fact { var v = data[settingName(f)]; f.value = v; } - changes = false; + updateCoef(); } function save() { @@ -52,7 +52,7 @@ Fact { continue; data[settingName(f)] = s; } - changes = false; + updateCoef(); return data; } @@ -70,6 +70,11 @@ Fact { } } + function updateCoef() { + coef = raCoef.value; + changes = false; + } + Fact { id: raCoef name: "coef" @@ -80,7 +85,6 @@ Fact { min: 0 max: 1 onValueChanged: { - coef = value; raFilter.value = "k=" + value; changes = true; } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index e43e2e661..5d2e9ce99 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -34,6 +34,10 @@ Fact { property bool newItem: false property var data: ({}) + // Chart values + property var type: "none" + property var expr: "" + signal addTriggered signal removeTriggered @@ -41,7 +45,6 @@ Fact { load(data); updateTitle(); updateDescr(); - setColor(); mTitle.valueChanged.connect(updateTitle); mBind.valueChanged.connect(updateDescr); mColor.valueChanged.connect(updateDescr); @@ -55,7 +58,7 @@ Fact { f.value = v; } mFilters.fillData(); - changes = false; + updateChartVars(); } function save() { @@ -71,7 +74,7 @@ Fact { } data[settingName(f)] = s; } - changes = false; + updateChartVars(); return data; } @@ -82,6 +85,13 @@ Fact { return n; } + function updateChartVars() { + expr = mBind.text; + type = mFilters.value; + changes = false; + setColor(); + } + function updateTitle() { if (newItem) return; @@ -119,13 +129,11 @@ Fact { } function updateValue() { - var expr = mBind.text; try { var v = new Function('return ' + expr)() if (v === undefined) throw new Error("expression is undefined") // Use filters - var type = mFilters.value; switch (type) { case "running_avg": useRunningAvgFilter(v); @@ -148,7 +156,6 @@ Fact { function useRunningAvgFilter(v) { var k = mFilters.getRunningAvgCoef(); value += (v - value) * k; - // console.log("use running avg filter", v, "/", value); } Fact { @@ -173,10 +180,7 @@ Fact { title: qsTr("Color") descr: qsTr("Chart color") value: "#ff0000" - onValueChanged: { - setColor() - changes = true - } + onValueChanged: changes = true Component.onCompleted: { var opt = opts; opt.page = "qrc:/FilteredCharts/FcColorChooser.qml"; From 68cfad1e6d315044cc029e23d317c76a94818495 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 6 Apr 2026 05:38:44 +0300 Subject: [PATCH 027/163] Color chooser color preview added and styles updated. --- .../Tools/FilteredCharts/FcColorChooser.qml | 108 +++++++++++------- 1 file changed, 65 insertions(+), 43 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml index 5ccbbc31a..0c0af026c 100644 --- a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml +++ b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml @@ -5,56 +5,78 @@ import QtQuick.Controls import Apx.Common import APX.Facts -Rectangle { - id: colorBox - border.width: 0 - color: "#282828" - implicitWidth: 280 * ui.scale - implicitHeight: 80 * ui.scale - // implicitHeight: 64 * ui.scale - - property var chartColor: "white" +Item { + id: colorChooser + property var space: Style.spacing * 1.2 - GridLayout { - columns: 12 - anchors.fill: parent - anchors.margins: Style.spacing * 1.2 - columnSpacing: Style.spacing * 1.2 - rowSpacing: Style.spacing * 1.2 - // columns: 8 + implicitWidth: 280 * ui.scale + implicitHeight: 100 * ui.scale + + Rectangle { + id: colorBox + border.width: 0 + color: "#282828" + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: colorPreview.top + + property var chartColor: "#ffffff" - Repeater { - model: [ // m.b. change: "#eee8aa", "#f0e68c", "#fffacd", "#ffffe0"(in yellow, orange), "#00fa9a"(in olive), "#dcdcdc"(in brown), "#f5f5f5"(in black) - "#ff7f50", "#db7093", "#f0e68c", "#fffacd", "#98fb98", "#00fa9a", "#add8e6", "#4682b4", "#9932cc", "#d8bfd8", "#dcdcdc", "#ffffff", - "#ff6347", "#ff69b4", "#eee8aa", "#ffffe0", "#00ff00", "#6b8e23", "#87ceeb", "#0000ff", "#8a2be2", "#dda0dd", "#deb887", "#f5f5f5", - "#ff4500", "#ff1493", "#ffa500", "#ffff00", "#32cd32", "#556b2f", "#00bfff", "#0000cd", "#9400d3", "#ee82ee", "#d2691e", "#808080", - "#ff0000", "#dc143c", "#ff8c00", "#ffd700", "#008000", '#122c1d', "#1e90ff", "#000080", "#800080", "#ba55d3", "#a52a2a", "#000000" - ] + GridLayout { + columns: 12 + anchors.fill: parent + anchors.margins: space + columnSpacing: space + rowSpacing: space + // columns: 8 - // model: [ - // "#ca2626", "#d69436", "#d6c544", "#74bf2f", "#6086af", "#926b8e", "#c59c5d", "#ffffff", - // "#ad0000", "#d06600", "#c9b300", "#61B218", "#2f568b", "#634568", "#a36914", "#b2b6af", - // "#8b0000", "#ae4e00", "#a68700", "#43820c", "#1f4072", "#4e3057", "#794c08", "#9da09a", - // ] + Repeater { + model: [ + "#ff8a8a", "#ffc0cb", "#eee8aa", "#ffffe0", "#98fb98", "#acbf69", "#add8e6", "#4169e1", "#CF9FFF", "#d8bfd8", "#ffebcd", "#ffffff", + "#ff7f50", "#ff69b4", "#ffd580", "#ffff8f", "#00ff00", "#6b8e23", "#87ceeb", "#0000ff", "#DA70D6", "#dda0dd", "#deb887", "#d3d3d3", + "#ff4500", "#ff1493", "#ffa500", "#ffff00", "#32cd32", "#556b2f", "#00bfff", "#0000cd", "#BF40BF", "#ee82ee", "#d2691e", "#808080", + "#ff0000", "#dc143c", "#ff8c00", "#ffd700", "#008000", '#3c4d03', "#1e90ff", "#000080", "#800080", "#ba55d3", "#a52a2a", "#000000" + ] - delegate: Rectangle { - property var chosen: mouseArea.containsMouse - Layout.fillWidth: true - Layout.fillHeight: true - // radius: height/12 - color: modelData - border.width: ui.scale >= 1 ? ui.scale : 1 - border.color: chosen ? "lightblue" : "transparent" - opacity: chosen ? 1 : 0.8 - scale: chosen ? 1.1 : 1.0 + delegate: Rectangle { + property var chosen: mouseArea.containsMouse + Layout.fillWidth: true + Layout.fillHeight: true + color: modelData + border.width: 1 + border.color: chosen ? "#b0c4de" : "transparent" + opacity: chosen ? 1 : 0.8 + scale: chosen ? 1.15 : 1.0 - MouseArea { - id: mouseArea - anchors.fill: parent - hoverEnabled: true - onClicked: fact.value = modelData; + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: fact.value = modelData; + } } } } } + RowLayout { + id: colorPreview + anchors.bottom: parent.bottom + spacing: space + + Rectangle { + color: fact.value + width: 22 * ui.scale + height: 14 * ui.scale + Layout.topMargin: space + Layout.leftMargin: space + } + + Label { + text: fact.value + font.pixelSize: Style.fontSize * 0.7 + Layout.topMargin: space + Layout.alignment: Qt.AlignVCenter + } + } } From 292a0b228e4b722347458638473beb0537dda689 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 6 Apr 2026 14:13:52 +0300 Subject: [PATCH 028/163] Chart fact style updated. New chart color value fixed. --- .../Tools/FilteredCharts/FcColorChooser.qml | 18 ++++++++++-------- .../Tools/FilteredCharts/FcMenuChart.qml | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml index 0c0af026c..dd4518ec2 100644 --- a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml +++ b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml @@ -7,6 +7,8 @@ import APX.Facts Item { id: colorChooser + + property var color: fact.value != undefined ? fact.value : "#ffffff" property var space: Style.spacing * 1.2 implicitWidth: 280 * ui.scale @@ -21,15 +23,12 @@ Item { anchors.right: parent.right anchors.bottom: colorPreview.top - property var chartColor: "#ffffff" - GridLayout { columns: 12 anchors.fill: parent anchors.margins: space columnSpacing: space rowSpacing: space - // columns: 8 Repeater { model: [ @@ -46,7 +45,7 @@ Item { color: modelData border.width: 1 border.color: chosen ? "#b0c4de" : "transparent" - opacity: chosen ? 1 : 0.8 + opacity: chosen ? 1 : 0.85 scale: chosen ? 1.15 : 1.0 MouseArea { @@ -65,15 +64,18 @@ Item { spacing: space Rectangle { - color: fact.value - width: 22 * ui.scale - height: 14 * ui.scale + color: colorChooser.color + width: 24 * ui.scale + height: 16 * ui.scale + border.width: ui.scale + border.color: "#383838" Layout.topMargin: space Layout.leftMargin: space + opacity: 0.85 } Label { - text: fact.value + text: colorChooser.color font.pixelSize: Style.fontSize * 0.7 Layout.topMargin: space Layout.alignment: Qt.AlignVCenter diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 5d2e9ce99..93eca74ac 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -113,7 +113,7 @@ Fact { continue; if (f.text === "") continue; - descrList.push(f.name.toUpperCase() + ": " + f.text); + descrList.push(f.name.toUpperCase() + ": " + f.text); } if (descrList.length > 0) descr = descrList.join(", "); @@ -179,7 +179,7 @@ Fact { name: "color" title: qsTr("Color") descr: qsTr("Chart color") - value: "#ff0000" + value: "#ffffff" onValueChanged: changes = true Component.onCompleted: { var opt = opts; From da3f9fc6b15ff53fb0c2c17c2d8544b27074f913 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 6 Apr 2026 19:54:20 +0300 Subject: [PATCH 029/163] Kalman filter added. --- .../FilteredCharts/FcFilterKalmanSimple.qml | 114 ++++++++++++++++++ .../FilteredCharts/FcFilterRunningAvg.qml | 2 +- .../Tools/FilteredCharts/FcMenuChart.qml | 39 +++++- .../Tools/FilteredCharts/FcMenuFilters.qml | 13 +- 4 files changed, 164 insertions(+), 4 deletions(-) create mode 100644 src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml new file mode 100644 index 000000000..d78f76273 --- /dev/null +++ b/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml @@ -0,0 +1,114 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick + +import APX.Facts + +Fact { + id: ksFilter + + flags: Fact.Group + + property bool changes: false + property var data: ({}) + property var coefs: [] + + onChangesChanged: { if (changes) fMenu.changes = true;} + + function load() { + for (var i = 0; i < size; ++i) { + var f = child(i); + var v = data[settingName(f)]; + f.value = v; + } + updateCoefs(); + } + + function save() { + data = {}; + for (var i = 0; i < size; ++i) { + var f = child(i); + var s = f.text.trim(); + if (s === "") + continue; + data[settingName(f)] = s; + } + updateCoefs(); + return data; + } + + function settingName(f) { + var n = f.name; + if (n.includes("_")) + return n.slice(0, n.indexOf("_")); + return n; + } + + function fillData() { + if (typeof value === 'object' && !Array.isArray(value) && value !== null) { + data = value; + load(); + } + } + + function updateFilterValue() { + ksFilter.value = "Km=" + ksMeasNoise.value + ",Ke=" + ksEnvNoise.value; + changes = true; + } + + function updateCoefs() { + coefs = [ksMeasNoise.value, ksEnvNoise.value] + changes = false; + } + + Fact { + id: ksMeasNoise + name: "measurement_noise" + title: qsTr("Measurement noise") + descr: qsTr("Coefficient of measurement noise") + flags: Fact.Float + value: 1 + min: 0 + max: 100 + onValueChanged: updateFilterValue() + } + Fact { + id: ksEnvNoise + name: "environment_noise" + title: qsTr("Environment noise") + descr: qsTr("Coefficient of environment noise") + flags: Fact.Float + value: 1 + min: 0 + max: 100 + onValueChanged: updateFilterValue() + } + + // Actions + Fact { + flags: (Fact.Action | Fact.Apply) + title: qsTr("Save") + enabled: !mChart.newItem && changes + icon: "check-circle" + onTriggered: fcControl.saveSettings() + } +} diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index 03b01dbcf..a97f21767 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -85,7 +85,7 @@ Fact { min: 0 max: 1 onValueChanged: { - raFilter.value = "k=" + value; + raFilter.value = "K=" + value; changes = true; } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 93eca74ac..7ef621e8e 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -88,6 +88,8 @@ Fact { function updateChartVars() { expr = mBind.text; type = mFilters.value; + if(type === "kalman_smp") + setKalmanState(0, 0.1) // set start state and covarience changes = false; setColor(); } @@ -135,9 +137,13 @@ Fact { throw new Error("expression is undefined") // Use filters switch (type) { - case "running_avg": + case "running_avg": useRunningAvgFilter(v); - default: + break; + case "kalman_smp": + useKalmanSmpFilter(v); + break; + default: value = v; } } catch (e) { @@ -153,11 +159,40 @@ Fact { } // Filters functions + // Running average filter function useRunningAvgFilter(v) { + if(Number.isNaN(value)) { + value = v; + return; + } var k = mFilters.getRunningAvgCoef(); value += (v - value) * k; } + + // Kalman simple filter + property var state: 0 + property var covariance: 0.1 + + function setKalmanState(st, cv) { + state = st; + covariance = cv; + } + + function useKalmanSmpFilter(v) { + var coefs = mFilters.getKalmanSimpleCoefs(); + + // Time update - prediction + var x0 = state; + var p0 = covariance + coefs[0]; + + // measurement update - correction + var k = p0 / (p0 + coefs[1]); + state = x0 + k * (v - x0); + covariance = (1 - k) * p0; + value = state; + } + Fact { id: mTitle name: "title" diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml index f84a92df7..fad9d3a1c 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml @@ -70,6 +70,7 @@ Fact { data = value; load(); fRunningAvg.fillData(); + fKalmanSimple.fillData(); changes = false; } } @@ -79,13 +80,17 @@ Fact { return fRunningAvg.coef; } + function getKalmanSimpleCoefs() { + return fKalmanSimple.coefs + } + Fact { id: fTypes name: "filters" title: qsTr("Filter") descr: qsTr("Selecting the filter to use") flags: Fact.Enum - enumStrings: ["none", "running_avg"] + enumStrings: ["none", "running_avg", "kalman_smp"] onTextChanged: fMenu.value = text onValueChanged: changes = true // combobox index changed } @@ -95,6 +100,12 @@ Fact { title: qsTr("Running average") descr: qsTr("Running average filter settings") } + FcFilterKalmanSimple { + id: fKalmanSimple + name: "kalman_smp" + title: qsTr("Kalman simple") + descr: qsTr("Simple kalman filter settings") + } // Actions Fact { From d38bbd37f88493ca1565ddf67edb25527a6ea7b6 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 6 Apr 2026 21:21:38 +0300 Subject: [PATCH 030/163] First value init for filters added. --- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 7ef621e8e..09fb79e68 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -88,8 +88,10 @@ Fact { function updateChartVars() { expr = mBind.text; type = mFilters.value; - if(type === "kalman_smp") - setKalmanState(0, 0.1) // set start state and covarience + if(type === "kalman_smp") { + var v = value !== undefined ? value : 0 + setKalmanState(v, 0.1) // set start state and covariance + } changes = false; setColor(); } @@ -135,6 +137,12 @@ Fact { var v = new Function('return ' + expr)() if (v === undefined) throw new Error("expression is undefined") + // For first init + if(value === undefined) { + setKalmanState(v, 0.1); + value = v + return; + } // Use filters switch (type) { case "running_avg": @@ -161,10 +169,6 @@ Fact { // Filters functions // Running average filter function useRunningAvgFilter(v) { - if(Number.isNaN(value)) { - value = v; - return; - } var k = mFilters.getRunningAvgCoef(); value += (v - value) * k; } From d5a1c9e54c25bc89279f014e2d7456c922dfa817 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 7 Apr 2026 17:23:20 +0300 Subject: [PATCH 031/163] Charts value saving added. --- .../Tools/FilteredCharts/FcMenuChart.qml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 09fb79e68..3f95c847f 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -51,6 +51,8 @@ Fact { mFilters.valueChanged.connect(updateDescr); } + onValueChanged: saveValue2Fact() + function load() { for (var i = 0; i < mChart.size; ++i) { var f = child(i); @@ -159,6 +161,15 @@ Fact { } } + function saveValue2Fact() { + var fname = mFact2Save.text; + if(!fname || fname === "" || fname === undefined) + return; + if(!apx.fleet.current.mandala.fact(fname, true)) + return; + apx.fleet.current.mandala.fact(fname, true).value = value; + } + function chartWarning(msg) { if(timer.running) return; @@ -264,6 +275,14 @@ Fact { enabled: false visible: false } + Fact { + id: mFact2Save + title: qsTr("Save to") + descr: qsTr("Variable for saving chart value") + flags: Fact.Int + units: "mandala" + onTextChanged: changes = true + } // Actions Fact { From b6e1ef5e51556fb0310ea00a8c0678eac088074a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 8 Apr 2026 12:43:36 +0300 Subject: [PATCH 032/163] Check vars for saving added. --- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 3f95c847f..8ecd96d0e 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -166,7 +166,11 @@ Fact { if(!fname || fname === "" || fname === undefined) return; if(!apx.fleet.current.mandala.fact(fname, true)) - return; + return; + if(!fname.includes("sns.scr")) { + chartWarning("Unacceptable variable name. Use 'src.scr' vars for saving!"); + return; + } apx.fleet.current.mandala.fact(fname, true).value = value; } @@ -207,7 +211,7 @@ Fact { covariance = (1 - k) * p0; value = state; } - + Fact { id: mTitle name: "title" From a689078971e700792f8fc7d9d957e66ffe4bb79c Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 8 Apr 2026 13:40:10 +0300 Subject: [PATCH 033/163] Filtred charts refactoring. --- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 3 +-- src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml | 1 - src/Plugins/Tools/FilteredCharts/FilteredCharts.qml | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 8ecd96d0e..bb5e62eff 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -188,7 +188,6 @@ Fact { value += (v - value) * k; } - // Kalman simple filter property var state: 0 property var covariance: 0.1 @@ -205,7 +204,7 @@ Fact { var x0 = state; var p0 = covariance + coefs[0]; - // measurement update - correction + // Measurement update - correction var k = p0 / (p0 + coefs[1]); state = x0 + k * (v - x0); covariance = (1 - k) * p0; diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml index fad9d3a1c..bd1080cef 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml @@ -33,7 +33,6 @@ Fact { onChangesChanged: { if (changes) mChart.changes = true;} - function load() { for (var i = 0; i < size; ++i) { var f = child(i); diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 2511902d5..0bbe2c4dc 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -153,7 +153,6 @@ Rectangle { TextButton { text: fcCharts.speedFactorValue + "x" - // onClicked: fcCharts.changeSpeed() Layout.fillHeight: true Layout.minimumWidth: height * 4 } From 0cf8c9f8d6a544cc7f9e6d12e80245655de678c5 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 8 Apr 2026 13:58:34 +0300 Subject: [PATCH 034/163] Fact to save update description implemented. --- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index bb5e62eff..3e90bae18 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -49,6 +49,7 @@ Fact { mBind.valueChanged.connect(updateDescr); mColor.valueChanged.connect(updateDescr); mFilters.valueChanged.connect(updateDescr); + mFact2Save.valueChanged.connect(updateDescr); } onValueChanged: saveValue2Fact() @@ -280,6 +281,7 @@ Fact { } Fact { id: mFact2Save + name: "save" title: qsTr("Save to") descr: qsTr("Variable for saving chart value") flags: Fact.Int From 2f7e8f91fc7e554a21b3bfc0e03e63af22e47d4a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 8 Apr 2026 14:23:41 +0300 Subject: [PATCH 035/163] Menu set refactoring. --- src/Plugins/Tools/FilteredCharts/FcMenuSet.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index db585411d..99b9fdca5 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -45,8 +45,6 @@ Fact { } function updateChartsValues() { - if (!fcBtn.checked) - return; for (var i = 0; i < msValues.size; ++i) msValues.child(i).updateValue(); } From 7ecae37533251fdd8d6e23e420290671bd498ea7 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 9 Apr 2026 14:40:47 +0300 Subject: [PATCH 036/163] Color menu added. --- .../Tools/FilteredCharts/FcMenuChart.qml | 18 +------ .../Tools/FilteredCharts/FcMenuColor.qml | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+), 16 deletions(-) create mode 100644 src/Plugins/Tools/FilteredCharts/FcMenuColor.qml diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 3e90bae18..074954a77 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -132,6 +132,7 @@ Fact { var opt = mChart.opts; opt.color = mColor.text; mChart.opts = opt; + mColor.changes = false; chartFact.updateBtnValues() } @@ -228,26 +229,11 @@ Fact { flags: Fact.Text onTextChanged: changes = true } - Fact { + FcMenuColor { id: mColor name: "color" title: qsTr("Color") descr: qsTr("Chart color") - value: "#ffffff" - onValueChanged: changes = true - Component.onCompleted: { - var opt = opts; - opt.page = "qrc:/FilteredCharts/FcColorChooser.qml"; - opts = opt; - } - Fact { - id: mApply - flags: (Fact.Action | Fact.Apply) - title: qsTr("Save") - enabled: !newItem && changes - icon: "check-circle" - onTriggered: fcControl.saveSettings() - } } FcMenuFilters { id: mFilters diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuColor.qml b/src/Plugins/Tools/FilteredCharts/FcMenuColor.qml new file mode 100644 index 000000000..d5f723100 --- /dev/null +++ b/src/Plugins/Tools/FilteredCharts/FcMenuColor.qml @@ -0,0 +1,47 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick + +import APX.Facts + +Fact { + value: "#ffffff" + + property var changes: false + + onValueChanged: changes = true + onChangesChanged: { if (changes) mChart.changes = true;} + Component.onCompleted: { + var opt = opts; + opt.page = "qrc:/FilteredCharts/FcColorChooser.qml"; + opts = opt; + } + + Fact { + id: mApply + flags: (Fact.Action | Fact.Apply) + title: qsTr("Save") + enabled: !newItem && changes + icon: "check-circle" + onTriggered: fcControl.saveSettings() + } +} From 4c5290d603b92c8e3e84fee7b677c17adc53ae25 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 9 Apr 2026 17:08:21 +0300 Subject: [PATCH 037/163] Write values without sending implemented. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 4 ++-- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 2 +- src/lib/ApxData/Mandala/MandalaFact.h | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index d83a7db50..10c4a2e2c 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -49,8 +49,8 @@ TextButton { Connections { target: apx.fleet.current.mandala function onTelemetryDecoded() { - if (checked) // Comment it to calculate all values ​​at once - fcMenuSet.updateChartsValues(); + // if (checked) // Comment it to calculate all values ​​at once + fcMenuSet.updateChartsValues(); } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 074954a77..2da65a20c 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -173,7 +173,7 @@ Fact { chartWarning("Unacceptable variable name. Use 'src.scr' vars for saving!"); return; } - apx.fleet.current.mandala.fact(fname, true).value = value; + apx.fleet.current.mandala.fact(fname, true).setRawValueLocal(value); } function chartWarning(msg) { diff --git a/src/lib/ApxData/Mandala/MandalaFact.h b/src/lib/ApxData/Mandala/MandalaFact.h index 491b24e3c..a3b594686 100644 --- a/src/lib/ApxData/Mandala/MandalaFact.h +++ b/src/lib/ApxData/Mandala/MandalaFact.h @@ -53,11 +53,11 @@ class MandalaFact : public Fact Q_INVOKABLE mandala::uid_t offset() const; + Q_INVOKABLE bool setRawValueLocal(QVariant v); + // units conversions void setValueFromStream(const QVariant &v); - bool setRawValueLocal(QVariant v); - void increment_rx_cnt(); auto rx_cnt() const { return _rx_cnt; } auto everReceived() const { return _everReceived; } From d1a3f5af8d3dc9857b4e8d1b369725190d088d83 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 10 Apr 2026 13:34:01 +0300 Subject: [PATCH 038/163] Coefs range and precision changed. --- src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml | 6 ++++-- src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml index d78f76273..910d10e87 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml @@ -88,7 +88,8 @@ Fact { flags: Fact.Float value: 1 min: 0 - max: 100 + max: 10000 + precision: 3 onValueChanged: updateFilterValue() } Fact { @@ -99,7 +100,8 @@ Fact { flags: Fact.Float value: 1 min: 0 - max: 100 + max: 10000 + precision: 3 onValueChanged: updateFilterValue() } diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index a97f21767..5a4b79bfd 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -84,6 +84,7 @@ Fact { value: 0 min: 0 max: 1 + precision: 3 onValueChanged: { raFilter.value = "K=" + value; changes = true; From fda3b2e52b5d258d0f36a11bc9d2f930f1f42fd5 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 11 Apr 2026 00:20:11 +0300 Subject: [PATCH 039/163] Values update not reset chart. Speed change updated. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 13 +++--------- .../Tools/FilteredCharts/FcChartsView.qml | 21 +++++++++++++++++-- .../Tools/FilteredCharts/FcMenuChart.qml | 1 + .../Tools/FilteredCharts/FcMenuSet.qml | 9 ++++++-- .../Tools/FilteredCharts/FilteredCharts.qml | 8 +++++++ 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index 10c4a2e2c..9e6dc6c45 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -34,17 +34,10 @@ TextButton { checkable: true ButtonGroup.group: buttonGroup textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor - + onActivated: fcCharts.facts = Qt.binding(function () { return values;}) - onPressed: { - if (checked) { - if (!fcMenuSet.active) { - fcMenuSet.trigger(); - } - } else { - fcCharts.speed = fcMenuSet.speed; - } - } + onCheckedChanged: if (checked) fcCharts.speedFactorValue = fcMenuSet.speed + onPressed: if (checked && !fcMenuSet.active) fcMenuSet.trigger() Connections { target: apx.fleet.current.mandala diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index 39ec9c48c..815f35ee0 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -38,7 +38,8 @@ Item { property real speed: 1 property real speedFactorValue: 1 - onFactsChanged: fcChartView.reset() + property bool resetOn: false + // onFactsChanged: fcChartView.reset() Connections { target: apx.fleet.current.mandala @@ -47,6 +48,23 @@ Item { } } + function resetChartView() { + fcChartView.reset(); + resetOn = false; + } + + function updateSeriesColor(index) { + if(fcChartView.count <= 0 || index < 0) + return; + if(fcChartView.count < index + 1) + return; + if(facts[index] === undefined) + return; + if(!facts[index].opts.color) + return; + fcChartView.series(index).color = facts[index].opts.color; + } + ChartView { id: fcChartView @@ -114,7 +132,6 @@ Item { axisY.max = dataPaddingZero; axisY.tickCount = 4; axisY.applyNiceNumbers(); - speedFactorValue = speed; } function appendData() { diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 2da65a20c..a74cd6eb7 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -133,6 +133,7 @@ Fact { opt.color = mColor.text; mChart.opts = opt; mColor.changes = false; + fcCharts.updateSeriesColor(indexInParent()); chartFact.updateBtnValues() } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 99b9fdca5..19a3e8a2c 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -30,7 +30,7 @@ Fact { title: "Charts #" + fcBtn.text property bool changes: false - property real speed: msSpeed.value + property alias speed: msSpeed.value property var values //from config function addNewChart() { @@ -127,6 +127,8 @@ Fact { min: 0.2 max: 4 onValueChanged: { + if(!fcBtn.checked) + return; fcCharts.speedFactorValue = value; changes = true; } @@ -143,7 +145,10 @@ Fact { id: msValues title: qsTr("Values") flags: (Fact.Group | Fact.Section | Fact.DragChildren) - onSizeChanged: updateBtnValues() + onSizeChanged: { + updateBtnValues() + fcCharts.resetOn = true; + } } // Actions diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 0bbe2c4dc..9f6ca2b70 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -61,6 +61,11 @@ Rectangle { json.sets.push(set); } application.prefs.saveFile("charts.json", JSON.stringify(json, ' ', 2)); + + if(fcCharts.resetOn) { + console.log("fcCharts=", fcCharts.resetOn); + fcCharts.resetChartView(); + } } function loadSettings() { @@ -83,6 +88,8 @@ Rectangle { for (var i in sets) { buttonGroup.buttons[i].loadSet(sets[i]); } + + fcCharts.resetChartView(); } ColumnLayout { @@ -101,6 +108,7 @@ Rectangle { ButtonGroup { id: buttonGroup + onCheckedButtonChanged: fcCharts.resetChartView() } RowLayout { From d69f5148877afe7bbd1dbd09736df0087b0b42cc Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 11 Apr 2026 03:42:22 +0300 Subject: [PATCH 040/163] Chart color change updated. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 4 +-- .../Tools/FilteredCharts/FcChartsView.qml | 29 ++++++++----------- .../Tools/FilteredCharts/FcMenuChart.qml | 3 +- .../Tools/FilteredCharts/FcMenuSet.qml | 14 ++++----- .../Tools/FilteredCharts/FilteredCharts.qml | 9 +----- 5 files changed, 22 insertions(+), 37 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index 9e6dc6c45..b02a6597a 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -36,8 +36,8 @@ TextButton { textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor onActivated: fcCharts.facts = Qt.binding(function () { return values;}) - onCheckedChanged: if (checked) fcCharts.speedFactorValue = fcMenuSet.speed - onPressed: if (checked && !fcMenuSet.active) fcMenuSet.trigger() + onCheckedChanged: if(checked) fcCharts.speedFactorValue = fcMenuSet.speed + onPressed: if(checked && !fcMenuSet.active) fcMenuSet.trigger() Connections { target: apx.fleet.current.mandala diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index 815f35ee0..c119dafae 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -38,8 +38,11 @@ Item { property real speed: 1 property real speedFactorValue: 1 - property bool resetOn: false - // onFactsChanged: fcChartView.reset() + property bool resetEnable: false + onFactsChanged: if(resetEnable) { + fcChartView.reset(); + resetEnable = false; + } Connections { target: apx.fleet.current.mandala @@ -48,21 +51,13 @@ Item { } } - function resetChartView() { - fcChartView.reset(); - resetOn = false; - } - - function updateSeriesColor(index) { - if(fcChartView.count <= 0 || index < 0) - return; - if(fcChartView.count < index + 1) - return; - if(facts[index] === undefined) - return; - if(!facts[index].opts.color) - return; - fcChartView.series(index).color = facts[index].opts.color; + function updateSeriesColor() { + for (var i = 0; i < facts.length; ++i) { + if(!fcChartView.series(i)) + continue; + if (fcChartView.series(i).color != facts[i].opts.color) + fcChartView.series(i).color = facts[i].opts.color; + } } ChartView { diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index a74cd6eb7..d4edabb44 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -103,7 +103,6 @@ Fact { if (newItem) return; title = mTitle.text ? mTitle.text : mBind.text; - chartFact.updateBtnValues() } function updateDescr() { @@ -133,8 +132,8 @@ Fact { opt.color = mColor.text; mChart.opts = opt; mColor.changes = false; - fcCharts.updateSeriesColor(indexInParent()); chartFact.updateBtnValues() + fcCharts.updateSeriesColor() } function updateValue() { diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 19a3e8a2c..cfff90af4 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -51,17 +51,18 @@ Fact { function save() { changes = false; - var values = []; + var tmpValues = []; for (var i = 0; i < msValues.size; ++i) { var mchart = msValues.child(i).save(); if (!mchart.bind) continue; - values.push(mchart); + tmpValues.push(mchart); } var set = {}; set.title = msTitle.value; set.speed = msSpeed.value; - set.values = values; + set.values = tmpValues; + updateBtnValues() return set; } @@ -78,6 +79,7 @@ Fact { for (var i in values) { createChart(values[i]); } + updateBtnValues() } function createChart(mchart) { @@ -113,7 +115,6 @@ Fact { onValueChanged: { chartFact.title = value; changes = true; - updateBtnValues() } } Fact { @@ -145,10 +146,7 @@ Fact { id: msValues title: qsTr("Values") flags: (Fact.Group | Fact.Section | Fact.DragChildren) - onSizeChanged: { - updateBtnValues() - fcCharts.resetOn = true; - } + onSizeChanged: fcCharts.resetEnable = true; } // Actions diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 9f6ca2b70..807226eb0 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -61,11 +61,6 @@ Rectangle { json.sets.push(set); } application.prefs.saveFile("charts.json", JSON.stringify(json, ' ', 2)); - - if(fcCharts.resetOn) { - console.log("fcCharts=", fcCharts.resetOn); - fcCharts.resetChartView(); - } } function loadSettings() { @@ -88,8 +83,6 @@ Rectangle { for (var i in sets) { buttonGroup.buttons[i].loadSet(sets[i]); } - - fcCharts.resetChartView(); } ColumnLayout { @@ -108,7 +101,7 @@ Rectangle { ButtonGroup { id: buttonGroup - onCheckedButtonChanged: fcCharts.resetChartView() + onCheckedButtonChanged: fcCharts.resetEnable = true } RowLayout { From 983341dd8086d3b170fcdb9341ad3c2a31dcb5a0 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 11 Apr 2026 04:06:03 +0300 Subject: [PATCH 041/163] Small fix for chart reset. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 5 ++++- src/Plugins/Tools/FilteredCharts/FcChartsView.qml | 1 + src/Plugins/Tools/FilteredCharts/FilteredCharts.qml | 1 - 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index b02a6597a..bcc5d8b64 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -35,9 +35,12 @@ TextButton { ButtonGroup.group: buttonGroup textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor - onActivated: fcCharts.facts = Qt.binding(function () { return values;}) onCheckedChanged: if(checked) fcCharts.speedFactorValue = fcMenuSet.speed onPressed: if(checked && !fcMenuSet.active) fcMenuSet.trigger() + onActivated: { + fcCharts.resetEnable = true + fcCharts.facts = Qt.binding(function () { return values;}) + } Connections { target: apx.fleet.current.mandala diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index c119dafae..57910ce78 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -39,6 +39,7 @@ Item { property real speedFactorValue: 1 property bool resetEnable: false + onFactsChanged: if(resetEnable) { fcChartView.reset(); resetEnable = false; diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 807226eb0..0bbe2c4dc 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -101,7 +101,6 @@ Rectangle { ButtonGroup { id: buttonGroup - onCheckedButtonChanged: fcCharts.resetEnable = true } RowLayout { From ee6c6c517165e5f6d2ce032a54729872430232a1 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 12 Apr 2026 03:43:56 +0300 Subject: [PATCH 042/163] Deleted item color update fix. --- src/Plugins/Tools/FilteredCharts/FcChartsView.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index 57910ce78..38bdf55e5 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -56,6 +56,8 @@ Item { for (var i = 0; i < facts.length; ++i) { if(!fcChartView.series(i)) continue; + if(fact?.[i] === undefined) + continue; if (fcChartView.series(i).color != facts[i].opts.color) fcChartView.series(i).color = facts[i].opts.color; } From b31ed47bc2c29fc1bba9eacbc875f318e7d05d3d Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 12 Apr 2026 05:03:58 +0300 Subject: [PATCH 043/163] Apply new scr after confirm and save. --- src/Plugins/Tools/FilteredCharts/FcChartsView.qml | 2 +- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index 38bdf55e5..fb565c009 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -56,7 +56,7 @@ Item { for (var i = 0; i < facts.length; ++i) { if(!fcChartView.series(i)) continue; - if(fact?.[i] === undefined) + if(facts?.[i] === undefined) continue; if (fcChartView.series(i).color != facts[i].opts.color) fcChartView.series(i).color = facts[i].opts.color; diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index d4edabb44..36008a386 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -37,6 +37,7 @@ Fact { // Chart values property var type: "none" property var expr: "" + property var scr: "" signal addTriggered signal removeTriggered @@ -91,6 +92,7 @@ Fact { function updateChartVars() { expr = mBind.text; type = mFilters.value; + scr = mFact2Save.text; if(type === "kalman_smp") { var v = value !== undefined ? value : 0 setKalmanState(v, 0.1) // set start state and covariance @@ -164,7 +166,7 @@ Fact { } function saveValue2Fact() { - var fname = mFact2Save.text; + var fname = scr; if(!fname || fname === "" || fname === undefined) return; if(!apx.fleet.current.mandala.fact(fname, true)) From 2c435531243e61f96b5660c514012f3b8f0bceb3 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 12 Apr 2026 07:21:36 +0300 Subject: [PATCH 044/163] Small fix. --- src/Plugins/Tools/FilteredCharts/FcChartsView.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index fb565c009..a7d7e271d 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -56,7 +56,7 @@ Item { for (var i = 0; i < facts.length; ++i) { if(!fcChartView.series(i)) continue; - if(facts?.[i] === undefined) + if(!facts?.[i].opts) continue; if (fcChartView.series(i).color != facts[i].opts.color) fcChartView.series(i).color = facts[i].opts.color; @@ -136,6 +136,7 @@ Item { var t = time + 1; var v = 0; var fact = {}; + console.log("length=", facts.length) for (var i = 0; i < facts.length; ++i) { appendDataValue(facts[i], t, i); } From 9c0abb6aa622a9680fbaf78a0e4d3e40d26b8cd3 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 12 Apr 2026 15:30:28 +0300 Subject: [PATCH 045/163] Black color for chart replace. --- src/Plugins/Tools/FilteredCharts/FcChartsView.qml | 1 - src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index a7d7e271d..36a79d8b2 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -136,7 +136,6 @@ Item { var t = time + 1; var v = 0; var fact = {}; - console.log("length=", facts.length) for (var i = 0; i < facts.length; ++i) { appendDataValue(facts[i], t, i); } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 36008a386..de31bcfdd 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -131,7 +131,7 @@ Fact { function setColor() { var opt = mChart.opts; - opt.color = mColor.text; + opt.color = mColor.text ? mColor.text : "#ffffff" // Black color for chart turn into white mChart.opts = opt; mColor.changes = false; chartFact.updateBtnValues() From f22252f5d0374fed9eb138b4d437ec1b30997773 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 12 Apr 2026 18:49:08 +0300 Subject: [PATCH 046/163] Fix colors uppercase names. --- src/Plugins/Tools/FilteredCharts/FcColorChooser.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml index dd4518ec2..63af24aa1 100644 --- a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml +++ b/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml @@ -32,9 +32,9 @@ Item { Repeater { model: [ - "#ff8a8a", "#ffc0cb", "#eee8aa", "#ffffe0", "#98fb98", "#acbf69", "#add8e6", "#4169e1", "#CF9FFF", "#d8bfd8", "#ffebcd", "#ffffff", - "#ff7f50", "#ff69b4", "#ffd580", "#ffff8f", "#00ff00", "#6b8e23", "#87ceeb", "#0000ff", "#DA70D6", "#dda0dd", "#deb887", "#d3d3d3", - "#ff4500", "#ff1493", "#ffa500", "#ffff00", "#32cd32", "#556b2f", "#00bfff", "#0000cd", "#BF40BF", "#ee82ee", "#d2691e", "#808080", + "#ff8a8a", "#ffc0cb", "#eee8aa", "#ffffe0", "#98fb98", "#acbf69", "#add8e6", "#4169e1", "#cf9fff", "#d8bfd8", "#ffebcd", "#ffffff", + "#ff7f50", "#ff69b4", "#ffd580", "#ffff8f", "#00ff00", "#6b8e23", "#87ceeb", "#0000ff", "#da70d6", "#dda0dd", "#deb887", "#d3d3d3", + "#ff4500", "#ff1493", "#ffa500", "#ffff00", "#32cd32", "#556b2f", "#00bfff", "#0000cd", "#bf40bf", "#ee82ee", "#d2691e", "#808080", "#ff0000", "#dc143c", "#ff8c00", "#ffd700", "#008000", '#3c4d03', "#1e90ff", "#000080", "#800080", "#ba55d3", "#a52a2a", "#000000" ] From f0c4930a57165ebddbd5f053ccc5731bdd8f3ceb Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 12 Apr 2026 20:43:57 +0300 Subject: [PATCH 047/163] Add chart color into description. --- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index de31bcfdd..0e0e897a6 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -121,7 +121,10 @@ Fact { continue; if (f.text === "") continue; - descrList.push(f.name.toUpperCase() + ": " + f.text); + if (f.name === "color") + descrList.push(f.name.toUpperCase() + ": " + f.text.toUpperCase() + ""); + else + descrList.push(f.name.toUpperCase() + ": " + f.text); } if (descrList.length > 0) descr = descrList.join(", "); From ef1a68568a494915857de89cde1e3d29a1c42105 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 12 Apr 2026 23:14:08 +0300 Subject: [PATCH 048/163] Chart colored icon added. --- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 2 ++ src/main/qml/Apx/Common/FactButton/FactButton.qml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 0e0e897a6..1b253f61f 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -29,6 +29,7 @@ Fact { flags: Fact.Group precision: 2 + icon: "rectangle" property bool changes: false property bool newItem: false @@ -135,6 +136,7 @@ Fact { function setColor() { var opt = mChart.opts; opt.color = mColor.text ? mColor.text : "#ffffff" // Black color for chart turn into white + opt.iconColor = opt.color; mChart.opts = opt; mColor.changes = false; chartFact.updateBtnValues() diff --git a/src/main/qml/Apx/Common/FactButton/FactButton.qml b/src/main/qml/Apx/Common/FactButton/FactButton.qml index 3414318d4..22c7eab16 100644 --- a/src/main/qml/Apx/Common/FactButton/FactButton.qml +++ b/src/main/qml/Apx/Common/FactButton/FactButton.qml @@ -104,7 +104,7 @@ ActionButton { property bool showNext: expandable property bool showDescr: descr - + iconColor: (fact && fact.opts.iconColor)?fact.opts.iconColor:Material.iconColor toolTipItem.visible: pressed toolTipItem.delay: Qt.styleHints.mousePressAndHoldInterval From 32a3f06b66706030fa3ae26f1f37742de7c413e6 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 13 Apr 2026 17:18:01 +0300 Subject: [PATCH 049/163] Fix newItem icon color. --- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 3 ++- src/Plugins/Tools/FilteredCharts/FcMenuSet.qml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 1b253f61f..55ae37bed 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -136,7 +136,8 @@ Fact { function setColor() { var opt = mChart.opts; opt.color = mColor.text ? mColor.text : "#ffffff" // Black color for chart turn into white - opt.iconColor = opt.color; + if(!newItem) + opt.iconColor = opt.color; mChart.opts = opt; mColor.changes = false; chartFact.updateBtnValues() diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index cfff90af4..1d4731dbe 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -137,7 +137,7 @@ Fact { FcMenuChart { id: msMenuChart title: qsTr("Add new chart") - descr: "Creating and setting a new chart" + descr: qsTr("Creating and setting a new chart") icon: "plus-circle" newItem: true onAddTriggered: createChart(save()) From 8fc0746fdadbb85e006fc11033f327015c9b6ed5 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 13 Apr 2026 19:48:31 +0300 Subject: [PATCH 050/163] Hide pinned menu when plugin closed. --- src/Plugins/Tools/FilteredCharts/FcMenuSet.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index 1d4731dbe..ae186534f 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -33,6 +33,8 @@ Fact { property alias speed: msSpeed.value property var values //from config + Component.onDestruction: removed() + function addNewChart() { msMenuChart.trigger(); } From 8a414c63111a1f852913ec2bf3754f82d93239eb Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 14 Apr 2026 13:24:52 +0300 Subject: [PATCH 051/163] Used scripts var check added. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 4 ++++ .../Tools/FilteredCharts/FcMenuChart.qml | 18 ++++++++++++++---- src/Plugins/Tools/FilteredCharts/FcMenuSet.qml | 9 ++++++++- .../Tools/FilteredCharts/FilteredCharts.qml | 7 +++++++ 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index bcc5d8b64..876fa7d08 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -72,6 +72,10 @@ TextButton { fcMenuSet.load(set); } + function getScrMatches(val) { + return fcMenuSet.checkScrs(val); + } + Timer { id: timer interval: 10000 diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 55ae37bed..35686f32e 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -148,7 +148,7 @@ Fact { try { var v = new Function('return ' + expr)() if (v === undefined) - throw new Error("expression is undefined") + throw new Error(qsTr("expression is undefined")) // For first init if(value === undefined) { setKalmanState(v, 0.1); @@ -178,7 +178,7 @@ Fact { if(!apx.fleet.current.mandala.fact(fname, true)) return; if(!fname.includes("sns.scr")) { - chartWarning("Unacceptable variable name. Use 'src.scr' vars for saving!"); + chartWarning(qsTr("Unacceptable variable name. Use 'src.scr' vars for saving!")); return; } apx.fleet.current.mandala.fact(fname, true).setRawValueLocal(value); @@ -187,10 +187,17 @@ Fact { function chartWarning(msg) { if(timer.running) return; - console.warn("Chart " + title + ": " + msg); + console.warn(qsTr("Chart") + " " + title + ": " + msg); timer.restart(); } + function hasScr(val) { + if(!val || val !== scr) + return false; + chartWarning(val + " " + qsTr("variable already used")); + return true; + } + // Filters functions // Running average filter function useRunningAvgFilter(v) { @@ -280,7 +287,10 @@ Fact { descr: qsTr("Variable for saving chart value") flags: Fact.Int units: "mandala" - onTextChanged: changes = true + onTextChanged: { + fcControl.checkScrMatches(text) + changes = true; + } } // Actions diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml index ae186534f..d6e9ef3e9 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml @@ -33,7 +33,7 @@ Fact { property alias speed: msSpeed.value property var values //from config - Component.onDestruction: removed() + Component.onDestruction: removed() // pinned menu closes when the plugin is closed function addNewChart() { msMenuChart.trigger(); @@ -107,6 +107,13 @@ Fact { } } + function checkScrs(val) { + var matches = false; + for(var i = 0; i < msValues.size; ++i) + if(msValues.child(i).hasScr(val)) matches = true; + return matches; + } + Fact { id: msTitle title: qsTr("Title") diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 0bbe2c4dc..ee48ed685 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -85,6 +85,13 @@ Rectangle { } } + function checkScrMatches(val) { + var matches = false; + for (var i = 0; i < buttonGroup.buttons.length; ++i) + if(buttonGroup.buttons[i].getScrMatches(val)) matches = true; + return matches; + } + ColumnLayout { id: layout anchors.fill: parent From d90d99ad21b915f11ffa893394b658ab2cfc9059 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 16 Apr 2026 13:38:10 +0300 Subject: [PATCH 052/163] Similar names fix. --- src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml | 2 +- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index 5a4b79bfd..50e02a1a6 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -77,7 +77,7 @@ Fact { Fact { id: raCoef - name: "coef" + name: "coefficient" title: qsTr("Coefficient") descr: qsTr("Coefficient for filtration") flags: Fact.Float diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 35686f32e..63aee1647 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -230,7 +230,7 @@ Fact { Fact { id: mTitle - name: "title" + name: "chartname" title: qsTr("Title") descr: qsTr("Chart name") flags: Fact.Text From ef2f9ce47cf761adb349151f546135991072d353 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 17 Apr 2026 11:48:20 +0300 Subject: [PATCH 053/163] Kalman filter coefs default value defined. --- src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml index 910d10e87..5469e0a45 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml @@ -29,8 +29,8 @@ Fact { flags: Fact.Group property bool changes: false + property var coefs: [1,1] property var data: ({}) - property var coefs: [] onChangesChanged: { if (changes) fMenu.changes = true;} From 16bc4b3c2246d2d5126abf1e2ae0bb20ea1ac2fa Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 17 Apr 2026 11:56:31 +0300 Subject: [PATCH 054/163] Plugin title and description corrected. --- src/Plugins/Tools/FilteredCharts/FilteredCharts.qml | 2 +- src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index ee48ed685..0a628e6cc 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -183,7 +183,7 @@ Rectangle { property string currentPage: buttonGroup.checkedButton.text Settings { - category: "filtredCharts" + category: "filteredCharts" property alias page: fcControl.currentPage } } diff --git a/src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml b/src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml index 2c7eb34c4..2110e1919 100755 --- a/src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml @@ -27,8 +27,8 @@ import Apx.Application AppPlugin { id: plugin - title: qsTr("Filtred Charts") - descr: qsTr("Realtime filtred chart") + title: qsTr("Filtered Charts") + descr: qsTr("Realtime filtered chart") icon: "poll-box-outline" sourceComponent: FilteredCharts {} From 28733ef4680f8c716e71994c4b3130b4830ecfdd Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 17 Apr 2026 12:53:20 +0300 Subject: [PATCH 055/163] Signals view refactored. --- src/Plugins/Tools/Signals/SignalsView.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsView.qml b/src/Plugins/Tools/Signals/SignalsView.qml index eb9c0855d..ced0458b9 100644 --- a/src/Plugins/Tools/Signals/SignalsView.qml +++ b/src/Plugins/Tools/Signals/SignalsView.qml @@ -126,8 +126,6 @@ Item { function appendData() { var t = time + 1; - var v = 0; - var fact = {}; for (var i = 0; i < facts.length; ++i) { appendDataValue(facts[i], t, i); } From 32e10d1ba3689c4974929db1746ebe82760cdad5 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 17 Apr 2026 13:29:32 +0300 Subject: [PATCH 056/163] ButtonGroup overflow check added. --- src/Plugins/Tools/FilteredCharts/FilteredCharts.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 0a628e6cc..83bff0725 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -81,7 +81,9 @@ Rectangle { } // Create charts for (var i in sets) { - buttonGroup.buttons[i].loadSet(sets[i]); + if(i < buttonGroup.buttons.length) { + buttonGroup.buttons[i].loadSet(sets[i]); + } } } From bf8b4237318038f7a92c43ff0489327efadbc16a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 17 Apr 2026 13:42:40 +0300 Subject: [PATCH 057/163] Warning messages function updated. --- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 63aee1647..1f381739e 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -33,6 +33,7 @@ Fact { property bool changes: false property bool newItem: false + property var warning: "" property var data: ({}) // Chart values @@ -185,8 +186,9 @@ Fact { } function chartWarning(msg) { - if(timer.running) + if(warning == msg && timer.running) return; + warning = msg; console.warn(qsTr("Chart") + " " + title + ": " + msg); timer.restart(); } From e9313309fc0a587459597c74fcff781e207f20ae Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 17 Apr 2026 13:49:32 +0300 Subject: [PATCH 058/163] The incorrect message correction. --- src/Plugins/Tools/FilteredCharts/FcMenuChart.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index 1f381739e..cdd87975a 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -179,7 +179,7 @@ Fact { if(!apx.fleet.current.mandala.fact(fname, true)) return; if(!fname.includes("sns.scr")) { - chartWarning(qsTr("Unacceptable variable name. Use 'src.scr' vars for saving!")); + chartWarning(qsTr("Unacceptable variable name. Use 'sns.scr' vars for saving!")); return; } apx.fleet.current.mandala.fact(fname, true).setRawValueLocal(value); From f9a00154249a0d23e5f7e7705f9d1d99681db1c8 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 17 Apr 2026 14:04:29 +0300 Subject: [PATCH 059/163] VS settings restore. --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 7d351970f..52f6eea6c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { "editor.formatOnType": true, - "editor.formatOnSave": false, + "editor.formatOnSave": true, "files.insertFinalNewline": true, "cmake.buildDirectory": "${workspaceFolder}/build", // "cmake.buildTask": true, From 681a7156d49d4c821169f1be178d81f9e39f2d77 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 17 Apr 2026 14:18:09 +0300 Subject: [PATCH 060/163] Set running avg defaults coef. --- src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml index 50e02a1a6..bd10ce9bc 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml @@ -30,7 +30,7 @@ Fact { property bool changes: false property var data: ({}) - property var coef: 0 + property var coef: 1 onChangesChanged: { if (changes) fMenu.changes = true;} @@ -81,7 +81,7 @@ Fact { title: qsTr("Coefficient") descr: qsTr("Coefficient for filtration") flags: Fact.Float - value: 0 + value: 1 min: 0 max: 1 precision: 3 From 737db79d4a206d3192f6ce30b300646f3c1e121e Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 17 Apr 2026 16:05:47 +0300 Subject: [PATCH 061/163] Small chart menu fix. --- .../Tools/FilteredCharts/FcMenuChart.qml | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index cdd87975a..ea147c8a8 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -26,7 +26,7 @@ import Apx.Common Fact { id: mChart - + flags: Fact.Group precision: 2 icon: "rectangle" @@ -95,9 +95,9 @@ Fact { expr = mBind.text; type = mFilters.value; scr = mFact2Save.text; - if(type === "kalman_smp") { - var v = value !== undefined ? value : 0 - setKalmanState(v, 0.1) // set start state and covariance + if (type === "kalman_smp") { + var v = value !== undefined ? value : 0; + setKalmanState(v, 0.1); // set start state and covariance } changes = false; setColor(); @@ -125,8 +125,8 @@ Fact { continue; if (f.name === "color") descrList.push(f.name.toUpperCase() + ": " + f.text.toUpperCase() + ""); - else - descrList.push(f.name.toUpperCase() + ": " + f.text); + else + descrList.push(f.name.toUpperCase() + ": " + f.text); } if (descrList.length > 0) descr = descrList.join(", "); @@ -136,35 +136,35 @@ Fact { function setColor() { var opt = mChart.opts; - opt.color = mColor.text ? mColor.text : "#ffffff" // Black color for chart turn into white - if(!newItem) + opt.color = mColor.text ? mColor.text : "#ffffff"; // Black color for chart turn into white + if (!newItem) opt.iconColor = opt.color; mChart.opts = opt; mColor.changes = false; - chartFact.updateBtnValues() - fcCharts.updateSeriesColor() + chartFact.updateBtnValues(); + fcCharts.updateSeriesColor(); } function updateValue() { try { - var v = new Function('return ' + expr)() + var v = new Function('return ' + expr)(); if (v === undefined) - throw new Error(qsTr("expression is undefined")) + throw new Error(qsTr("expression is undefined")); // For first init - if(value === undefined) { + if (value === undefined) { setKalmanState(v, 0.1); - value = v + value = v; return; - } + } // Use filters switch (type) { - case "running_avg": + case "running_avg": useRunningAvgFilter(v); break; case "kalman_smp": useKalmanSmpFilter(v); - break; - default: + break; + default: value = v; } } catch (e) { @@ -174,29 +174,29 @@ Fact { function saveValue2Fact() { var fname = scr; - if(!fname || fname === "" || fname === undefined) + if (!fname || fname === "" || fname === undefined) return; - if(!apx.fleet.current.mandala.fact(fname, true)) + if (!apx.fleet.current.mandala.fact(fname, true)) return; - if(!fname.includes("sns.scr")) { + if (!fname.includes("sns.scr")) { chartWarning(qsTr("Unacceptable variable name. Use 'sns.scr' vars for saving!")); return; - } + } apx.fleet.current.mandala.fact(fname, true).setRawValueLocal(value); } function chartWarning(msg) { - if(warning == msg && timer.running) + if (warning == msg && timer.running) return; - warning = msg; + warning = msg; console.warn(qsTr("Chart") + " " + title + ": " + msg); timer.restart(); } function hasScr(val) { - if(!val || val !== scr) + if (!val || val !== scr) return false; - chartWarning(val + " " + qsTr("variable already used")); + chartWarning(val + " " + qsTr("variable already used")); return true; } @@ -218,7 +218,7 @@ Fact { function useKalmanSmpFilter(v) { var coefs = mFilters.getKalmanSimpleCoefs(); - + // Time update - prediction var x0 = state; var p0 = covariance + coefs[0]; @@ -229,7 +229,7 @@ Fact { covariance = (1 - k) * p0; value = state; } - + Fact { id: mTitle name: "chartname" @@ -290,7 +290,7 @@ Fact { flags: Fact.Int units: "mandala" onTextChanged: { - fcControl.checkScrMatches(text) + fcControl.checkScrMatches(text); changes = true; } } @@ -310,7 +310,7 @@ Fact { Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - enabled: !newItem && !mAdd.enable && changes + enabled: !newItem && !mAdd.enabled && changes icon: "check-circle" onTriggered: fcControl.saveSettings() } From 3904baa3f156a265ea9137d0022e6f853ae54890 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 17 Apr 2026 16:25:54 +0300 Subject: [PATCH 062/163] Update series color fix. --- src/Plugins/Tools/FilteredCharts/FcChartsView.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index 36a79d8b2..8ef407d8c 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -56,8 +56,8 @@ Item { for (var i = 0; i < facts.length; ++i) { if(!fcChartView.series(i)) continue; - if(!facts?.[i].opts) - continue; + if(!facts || !facts[i] || !facts[i].opts) + continue; if (fcChartView.series(i).color != facts[i].opts.color) fcChartView.series(i).color = facts[i].opts.color; } From fa708d7d7a5041c274265db9b71951bd516c52b9 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 17 Apr 2026 16:32:08 +0300 Subject: [PATCH 063/163] Color menu button refactored. --- src/Plugins/Tools/FilteredCharts/FcMenuColor.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuColor.qml b/src/Plugins/Tools/FilteredCharts/FcMenuColor.qml index d5f723100..d3c2b58e4 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuColor.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuColor.qml @@ -40,7 +40,7 @@ Fact { id: mApply flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - enabled: !newItem && changes + enabled: !mChart.newItem && changes icon: "check-circle" onTriggered: fcControl.saveSettings() } From f66ca99c78da658dae0f2c35cf6aa4ad21c6637c Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 19 Apr 2026 20:34:55 +0300 Subject: [PATCH 064/163] Button minor fix. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index 876fa7d08..e38eaf7a8 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -22,6 +22,7 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts +import QtQuick.Controls.Material import Apx.Common @@ -34,12 +35,16 @@ TextButton { checkable: true ButtonGroup.group: buttonGroup textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor - - onCheckedChanged: if(checked) fcCharts.speedFactorValue = fcMenuSet.speed - onPressed: if(checked && !fcMenuSet.active) fcMenuSet.trigger() + + onCheckedChanged: if (checked) + fcCharts.speedFactorValue = fcMenuSet.speed + onPressed: if (checked && !fcMenuSet.active) + fcMenuSet.trigger() onActivated: { - fcCharts.resetEnable = true - fcCharts.facts = Qt.binding(function () { return values;}) + fcCharts.resetEnable = true; + fcCharts.facts = Qt.binding(function () { + return values; + }); } Connections { @@ -51,8 +56,8 @@ TextButton { } function updateToolTip(facts) { - var s = []; - s.push("" + fcMenuSet.title + ""); + var s = []; + s.push("" + fcMenuSet.title + ""); for (var i = 0; i < facts.length; ++i) { var fact = facts[i]; s.push("" + fact.title + ""); From 3c41e3f59312a4f511d93c5b7ef74d34455bb0a1 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 19 Apr 2026 20:58:48 +0300 Subject: [PATCH 065/163] Charts view refactoring. --- src/Plugins/Tools/FilteredCharts/FcChartsView.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index 8ef407d8c..dd94c2f49 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -134,8 +134,6 @@ Item { function appendData() { var t = time + 1; - var v = 0; - var fact = {}; for (var i = 0; i < facts.length; ++i) { appendDataValue(facts[i], t, i); } From c72cdaba39b084c2a0264af8907f3e0b09680035 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 23 Apr 2026 17:24:12 +0300 Subject: [PATCH 066/163] Change speed with a button click. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 11 +++++++++++ src/Plugins/Tools/FilteredCharts/FcChartsView.qml | 2 +- .../Tools/FilteredCharts/FilteredCharts.qml | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index e38eaf7a8..7f0413fe0 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -81,11 +81,22 @@ TextButton { return fcMenuSet.checkScrs(val); } + function setSpeed(val) { + fcMenuSet.speed = val; + saveTimer.restart(); // save settings after speed changed + } + Timer { id: timer interval: 10000 } + Timer { + id: saveTimer + interval: 1000 + onTriggered: fcControl.saveSettings() + } + FcMenuSet { id: fcMenuSet } diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml index dd94c2f49..1e911ee1c 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/FcChartsView.qml @@ -35,7 +35,7 @@ Item { property real lineWidth: ui.antialiasing ? 1.5 : 1 property real lineWidthCmd: ui.antialiasing ? 2.1 : 2 - property real speed: 1 + property var speedFactor: [0.2, 0.5, 1, 2, 4] property real speedFactorValue: 1 property bool resetEnable: false diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 83bff0725..9608edf38 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -94,6 +94,19 @@ Rectangle { return matches; } + function changeSpeed() { + if(fcCharts.speedFactorValue !== fcCharts.speedFactor[fcCharts.speedFactor.length - 1]) { + for (var i = 0; i < fcCharts.speedFactor.length-1; ++i) { + if (fcCharts.speedFactor[i] <= fcCharts.speedFactorValue && fcCharts.speedFactorValue < fcCharts.speedFactor[i+1]) { + buttonGroup.checkedButton.setSpeed(fcCharts.speedFactor[i+1]) + break; + } + } + } else { + buttonGroup.checkedButton.setSpeed(fcCharts.speedFactor[0]) + } + } + ColumnLayout { id: layout anchors.fill: parent @@ -164,6 +177,7 @@ Rectangle { text: fcCharts.speedFactorValue + "x" Layout.fillHeight: true Layout.minimumWidth: height * 4 + onClicked: changeSpeed() } } } From 08125c46fc5cd7b9d4b9293832fbb3f3be91cf4f Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 25 Apr 2026 00:50:24 +0300 Subject: [PATCH 067/163] MenuPage refactoring. --- src/Plugins/Tools/FilteredCharts/FcButton.qml | 24 +++++++++--------- .../Tools/FilteredCharts/FcMenuChart.qml | 2 +- .../{FcMenuSet.qml => FcMenuPage.qml} | 25 ++++++++++--------- 3 files changed, 26 insertions(+), 25 deletions(-) rename src/Plugins/Tools/FilteredCharts/{FcMenuSet.qml => FcMenuPage.qml} (90%) diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/FcButton.qml index 7f0413fe0..dc20920b2 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/FcButton.qml @@ -37,9 +37,9 @@ TextButton { textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor onCheckedChanged: if (checked) - fcCharts.speedFactorValue = fcMenuSet.speed - onPressed: if (checked && !fcMenuSet.active) - fcMenuSet.trigger() + fcCharts.speedFactorValue = fcMenuPage.speed + onPressed: if (checked && !fcMenuPage.active) + fcMenuPage.trigger() onActivated: { fcCharts.resetEnable = true; fcCharts.facts = Qt.binding(function () { @@ -51,13 +51,13 @@ TextButton { target: apx.fleet.current.mandala function onTelemetryDecoded() { // if (checked) // Comment it to calculate all values ​​at once - fcMenuSet.updateChartsValues(); + fcMenuPage.updateChartsValues(); } } function updateToolTip(facts) { var s = []; - s.push("" + fcMenuSet.title + ""); + s.push("" + fcMenuPage.title + ""); for (var i = 0; i < facts.length; ++i) { var fact = facts[i]; s.push("" + fact.title + ""); @@ -66,23 +66,23 @@ TextButton { } function callQuickChart() { - fcMenuSet.addNewChart(); + fcMenuPage.addNewChart(); } function getSet() { - return fcMenuSet.save(); + return fcMenuPage.save(); } function loadSet(set) { - fcMenuSet.load(set); + fcMenuPage.load(set); } function getScrMatches(val) { - return fcMenuSet.checkScrs(val); + return fcMenuPage.checkScrs(val); } function setSpeed(val) { - fcMenuSet.speed = val; + fcMenuPage.speed = val; saveTimer.restart(); // save settings after speed changed } @@ -97,7 +97,7 @@ TextButton { onTriggered: fcControl.saveSettings() } - FcMenuSet { - id: fcMenuSet + FcMenuPage { + id: fcMenuPage } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml index ea147c8a8..328952405 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml @@ -141,7 +141,7 @@ Fact { opt.iconColor = opt.color; mChart.opts = opt; mColor.changes = false; - chartFact.updateBtnValues(); + pageFact.updateBtnValues(); fcCharts.updateSeriesColor(); } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml b/src/Plugins/Tools/FilteredCharts/FcMenuPage.qml similarity index 90% rename from src/Plugins/Tools/FilteredCharts/FcMenuSet.qml rename to src/Plugins/Tools/FilteredCharts/FcMenuPage.qml index d6e9ef3e9..d5b3327c6 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/FcMenuPage.qml @@ -24,10 +24,10 @@ import QtQuick import APX.Facts Fact { - id: chartFact - + id: pageFact + flags: (Fact.Group | Fact.FlatModel) - title: "Charts #" + fcBtn.text + title: "Page #" + fcBtn.text property bool changes: false property alias speed: msSpeed.value @@ -43,7 +43,7 @@ Fact { fcBtn.values = []; for (var i = 0; i < msValues.size; ++i) fcBtn.values.push(msValues.child(i)); - fcBtn.updateToolTip(fcBtn.values); + fcBtn.updateToolTip(fcBtn.values); } function updateChartsValues() { @@ -64,7 +64,7 @@ Fact { set.title = msTitle.value; set.speed = msSpeed.value; set.values = tmpValues; - updateBtnValues() + updateBtnValues(); return set; } @@ -81,7 +81,7 @@ Fact { for (var i in values) { createChart(values[i]); } - updateBtnValues() + updateBtnValues(); } function createChart(mchart) { @@ -109,8 +109,9 @@ Fact { function checkScrs(val) { var matches = false; - for(var i = 0; i < msValues.size; ++i) - if(msValues.child(i).hasScr(val)) matches = true; + for (var i = 0; i < msValues.size; ++i) + if (msValues.child(i).hasScr(val)) + matches = true; return matches; } @@ -120,9 +121,9 @@ Fact { descr: qsTr("Charts title") flags: Fact.Text icon: "rename-box" - value: chartFact.title + value: pageFact.title onValueChanged: { - chartFact.title = value; + pageFact.title = value; changes = true; } } @@ -137,7 +138,7 @@ Fact { min: 0.2 max: 4 onValueChanged: { - if(!fcBtn.checked) + if (!fcBtn.checked) return; fcCharts.speedFactorValue = value; changes = true; @@ -155,7 +156,7 @@ Fact { id: msValues title: qsTr("Values") flags: (Fact.Group | Fact.Section | Fact.DragChildren) - onSizeChanged: fcCharts.resetEnable = true; + onSizeChanged: fcCharts.resetEnable = true } // Actions From 838a648566086b7d61e78ccb5668ce10cf87cf23 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 25 Apr 2026 01:12:16 +0300 Subject: [PATCH 068/163] PageButton refactoring. --- .../Tools/FilteredCharts/FilteredCharts.qml | 35 ++++++++++--------- .../{FcButton.qml => PageButton.qml} | 2 +- 2 files changed, 19 insertions(+), 18 deletions(-) rename src/Plugins/Tools/FilteredCharts/{FcButton.qml => PageButton.qml} (99%) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 9608edf38..dd0b72b29 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -81,7 +81,7 @@ Rectangle { } // Create charts for (var i in sets) { - if(i < buttonGroup.buttons.length) { + if (i < buttonGroup.buttons.length) { buttonGroup.buttons[i].loadSet(sets[i]); } } @@ -90,20 +90,21 @@ Rectangle { function checkScrMatches(val) { var matches = false; for (var i = 0; i < buttonGroup.buttons.length; ++i) - if(buttonGroup.buttons[i].getScrMatches(val)) matches = true; + if (buttonGroup.buttons[i].getScrMatches(val)) + matches = true; return matches; } function changeSpeed() { - if(fcCharts.speedFactorValue !== fcCharts.speedFactor[fcCharts.speedFactor.length - 1]) { - for (var i = 0; i < fcCharts.speedFactor.length-1; ++i) { - if (fcCharts.speedFactor[i] <= fcCharts.speedFactorValue && fcCharts.speedFactorValue < fcCharts.speedFactor[i+1]) { - buttonGroup.checkedButton.setSpeed(fcCharts.speedFactor[i+1]) + if (fcCharts.speedFactorValue !== fcCharts.speedFactor[fcCharts.speedFactor.length - 1]) { + for (var i = 0; i < fcCharts.speedFactor.length - 1; ++i) { + if (fcCharts.speedFactor[i] <= fcCharts.speedFactorValue && fcCharts.speedFactorValue < fcCharts.speedFactor[i + 1]) { + buttonGroup.checkedButton.setSpeed(fcCharts.speedFactor[i + 1]); break; } } } else { - buttonGroup.checkedButton.setSpeed(fcCharts.speedFactor[0]) + buttonGroup.checkedButton.setSpeed(fcCharts.speedFactor[0]); } } @@ -131,44 +132,44 @@ Rectangle { Layout.margins: Style.spacing spacing: 3 Layout.maximumHeight: 24 * ui.scale - FcButton { + PageButton { text: "1" checked: true values: [] } - FcButton { + PageButton { text: "2" values: [] } - FcButton { + PageButton { text: "3" values: [] } - FcButton { + PageButton { text: "4" values: [] } - FcButton { + PageButton { text: "5" values: [] } - FcButton { + PageButton { text: "6" values: [] } - FcButton { + PageButton { text: "7" values: [] } - FcButton { + PageButton { text: "8" values: [] } - FcButton { + PageButton { text: "9" values: [] } - FcButton { + PageButton { text: "10" values: [] } diff --git a/src/Plugins/Tools/FilteredCharts/FcButton.qml b/src/Plugins/Tools/FilteredCharts/PageButton.qml similarity index 99% rename from src/Plugins/Tools/FilteredCharts/FcButton.qml rename to src/Plugins/Tools/FilteredCharts/PageButton.qml index dc20920b2..85d8a9b58 100644 --- a/src/Plugins/Tools/FilteredCharts/FcButton.qml +++ b/src/Plugins/Tools/FilteredCharts/PageButton.qml @@ -27,7 +27,7 @@ import QtQuick.Controls.Material import Apx.Common TextButton { - id: fcBtn + id: pageBtn property var values: [] From 239fe20c0457fc62d7142c670e9d1597d08ef200 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 25 Apr 2026 02:13:55 +0300 Subject: [PATCH 069/163] Refactoring and preparing chart for transfer to signals. --- .../Tools/FilteredCharts/FilteredCharts.qml | 42 ++--- .../{PageButton.qml => SignalsButton.qml} | 32 ++-- ...{FcChartsView.qml => SignalsChartView.qml} | 38 ++-- ...lorChooser.qml => SignalsColorChooser.qml} | 0 ...mple.qml => SignalsFilterKalmanSimple.qml} | 2 +- ...ingAvg.qml => SignalsFilterRunningAvg.qml} | 2 +- .../{FcMenuChart.qml => SignalsMenuChart.qml} | 10 +- .../{FcMenuColor.qml => SignalsMenuColor.qml} | 4 +- ...MenuFilters.qml => SignalsMenuFilters.qml} | 6 +- .../{FcMenuPage.qml => SignalsMenuPage.qml} | 20 +-- .../Tools/FilteredCharts/SignalsMenuSet.qml | 170 ++++++++++++++++++ 11 files changed, 248 insertions(+), 78 deletions(-) rename src/Plugins/Tools/FilteredCharts/{PageButton.qml => SignalsButton.qml} (78%) rename src/Plugins/Tools/FilteredCharts/{FcChartsView.qml => SignalsChartView.qml} (87%) rename src/Plugins/Tools/FilteredCharts/{FcColorChooser.qml => SignalsColorChooser.qml} (100%) rename src/Plugins/Tools/FilteredCharts/{FcFilterKalmanSimple.qml => SignalsFilterKalmanSimple.qml} (98%) rename src/Plugins/Tools/FilteredCharts/{FcFilterRunningAvg.qml => SignalsFilterRunningAvg.qml} (98%) rename src/Plugins/Tools/FilteredCharts/{FcMenuChart.qml => SignalsMenuChart.qml} (97%) rename src/Plugins/Tools/FilteredCharts/{FcMenuColor.qml => SignalsMenuColor.qml} (92%) rename src/Plugins/Tools/FilteredCharts/{FcMenuFilters.qml => SignalsMenuFilters.qml} (96%) rename src/Plugins/Tools/FilteredCharts/{FcMenuPage.qml => SignalsMenuPage.qml} (90%) create mode 100644 src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index dd0b72b29..aac3a82da 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -28,7 +28,7 @@ import QtCore import Apx.Common Rectangle { - id: fcControl + id: sgControl implicitHeight: layout.implicitHeight implicitWidth: layout.implicitWidth @@ -38,7 +38,7 @@ Rectangle { Component.onCompleted: { for (var i = 0; i < buttonGroup.buttons.length; ++i) { var b = buttonGroup.buttons[i]; - if (b.text !== fcControl.currentPage) + if (b.text !== sgControl.currentPage) continue; buttonGroup.checkedButton = b; break; @@ -96,15 +96,15 @@ Rectangle { } function changeSpeed() { - if (fcCharts.speedFactorValue !== fcCharts.speedFactor[fcCharts.speedFactor.length - 1]) { - for (var i = 0; i < fcCharts.speedFactor.length - 1; ++i) { - if (fcCharts.speedFactor[i] <= fcCharts.speedFactorValue && fcCharts.speedFactorValue < fcCharts.speedFactor[i + 1]) { - buttonGroup.checkedButton.setSpeed(fcCharts.speedFactor[i + 1]); + if (sgCharts.speedFactorValue !== sgCharts.speedFactor[sgCharts.speedFactor.length - 1]) { + for (var i = 0; i < sgCharts.speedFactor.length - 1; ++i) { + if (sgCharts.speedFactor[i] <= sgCharts.speedFactorValue && sgCharts.speedFactorValue < sgCharts.speedFactor[i + 1]) { + buttonGroup.checkedButton.setSpeed(sgCharts.speedFactor[i + 1]); break; } } } else { - buttonGroup.checkedButton.setSpeed(fcCharts.speedFactor[0]); + buttonGroup.checkedButton.setSpeed(sgCharts.speedFactor[0]); } } @@ -113,8 +113,8 @@ Rectangle { anchors.fill: parent spacing: 0 - FcChartsView { - id: fcCharts + SignalsChartView { + id: sgCharts facts: [] Layout.fillWidth: true Layout.fillHeight: true @@ -132,50 +132,50 @@ Rectangle { Layout.margins: Style.spacing spacing: 3 Layout.maximumHeight: 24 * ui.scale - PageButton { + SignalsButton { text: "1" checked: true values: [] } - PageButton { + SignalsButton { text: "2" values: [] } - PageButton { + SignalsButton { text: "3" values: [] } - PageButton { + SignalsButton { text: "4" values: [] } - PageButton { + SignalsButton { text: "5" values: [] } - PageButton { + SignalsButton { text: "6" values: [] } - PageButton { + SignalsButton { text: "7" values: [] } - PageButton { + SignalsButton { text: "8" values: [] } - PageButton { + SignalsButton { text: "9" values: [] } - PageButton { + SignalsButton { text: "10" values: [] } TextButton { - text: fcCharts.speedFactorValue + "x" + text: sgCharts.speedFactorValue + "x" Layout.fillHeight: true Layout.minimumWidth: height * 4 onClicked: changeSpeed() @@ -201,6 +201,6 @@ Rectangle { Settings { category: "filteredCharts" - property alias page: fcControl.currentPage + property alias page: sgControl.currentPage } } diff --git a/src/Plugins/Tools/FilteredCharts/PageButton.qml b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml similarity index 78% rename from src/Plugins/Tools/FilteredCharts/PageButton.qml rename to src/Plugins/Tools/FilteredCharts/SignalsButton.qml index 85d8a9b58..aae9fedde 100644 --- a/src/Plugins/Tools/FilteredCharts/PageButton.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml @@ -27,7 +27,7 @@ import QtQuick.Controls.Material import Apx.Common TextButton { - id: pageBtn + id: sgBtn property var values: [] @@ -37,12 +37,12 @@ TextButton { textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor onCheckedChanged: if (checked) - fcCharts.speedFactorValue = fcMenuPage.speed - onPressed: if (checked && !fcMenuPage.active) - fcMenuPage.trigger() + sgCharts.speedFactorValue = sgMenuPage.speed + onPressed: if (checked && !sgMenuPage.active) + sgMenuPage.trigger() onActivated: { - fcCharts.resetEnable = true; - fcCharts.facts = Qt.binding(function () { + sgCharts.resetEnable = true; + sgCharts.facts = Qt.binding(function () { return values; }); } @@ -51,13 +51,13 @@ TextButton { target: apx.fleet.current.mandala function onTelemetryDecoded() { // if (checked) // Comment it to calculate all values ​​at once - fcMenuPage.updateChartsValues(); + sgMenuPage.updateChartsValues(); } } function updateToolTip(facts) { var s = []; - s.push("" + fcMenuPage.title + ""); + s.push("" + sgMenuPage.title + ""); for (var i = 0; i < facts.length; ++i) { var fact = facts[i]; s.push("" + fact.title + ""); @@ -66,23 +66,23 @@ TextButton { } function callQuickChart() { - fcMenuPage.addNewChart(); + sgMenuPage.addNewChart(); } function getSet() { - return fcMenuPage.save(); + return sgMenuPage.save(); } function loadSet(set) { - fcMenuPage.load(set); + sgMenuPage.load(set); } function getScrMatches(val) { - return fcMenuPage.checkScrs(val); + return sgMenuPage.checkScrs(val); } function setSpeed(val) { - fcMenuPage.speed = val; + sgMenuPage.speed = val; saveTimer.restart(); // save settings after speed changed } @@ -94,10 +94,10 @@ TextButton { Timer { id: saveTimer interval: 1000 - onTriggered: fcControl.saveSettings() + onTriggered: sgControl.saveSettings() } - FcMenuPage { - id: fcMenuPage + SignalsMenuPage { + id: sgMenuPage } } diff --git a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml b/src/Plugins/Tools/FilteredCharts/SignalsChartView.qml similarity index 87% rename from src/Plugins/Tools/FilteredCharts/FcChartsView.qml rename to src/Plugins/Tools/FilteredCharts/SignalsChartView.qml index 1e911ee1c..4f590f947 100644 --- a/src/Plugins/Tools/FilteredCharts/FcChartsView.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsChartView.qml @@ -25,7 +25,7 @@ import QtQuick.Controls import QtQml Item { - id: fcChartItem + id: chartItem property var facts: [] @@ -39,32 +39,32 @@ Item { property real speedFactorValue: 1 property bool resetEnable: false - - onFactsChanged: if(resetEnable) { - fcChartView.reset(); + + onFactsChanged: if (resetEnable) { + chartView.reset(); resetEnable = false; } Connections { target: apx.fleet.current.mandala function onTelemetryDecoded() { - fcChartView.appendData(); + chartView.appendData(); } } function updateSeriesColor() { for (var i = 0; i < facts.length; ++i) { - if(!fcChartView.series(i)) + if (!chartView.series(i)) continue; - if(!facts || !facts[i] || !facts[i].opts) + if (!facts || !facts[i] || !facts[i].opts) continue; - if (fcChartView.series(i).color != facts[i].opts.color) - fcChartView.series(i).color = facts[i].opts.color; + if (chartView.series(i).color != facts[i].opts.color) + chartView.series(i).color = facts[i].opts.color; } } ChartView { - id: fcChartView + id: chartView antialiasing: ui.antialiasing legend.visible: false @@ -91,14 +91,14 @@ Item { ValueAxis { id: axisX - property real t: fcChartView.time + property real t: chartView.time Behavior on t { - enabled: ui.smooth && fcChartView.dataExist + enabled: ui.smooth && chartView.dataExist NumberAnimation { duration: 500 } } - min: t - fcChartView.samples + 20 + min: t - chartView.samples + 20 max: t visible: false gridVisible: false @@ -123,9 +123,9 @@ Item { property int timeRescale: 0 function reset() { - fcChartView.removeAllSeries(); - fcChartView.sdata = []; - fcChartView.time = 0; + chartView.removeAllSeries(); + chartView.sdata = []; + chartView.time = 0; axisY.min = -dataPaddingZero; axisY.max = dataPaddingZero; axisY.tickCount = 4; @@ -169,9 +169,9 @@ Item { } function appendDataValue(fact, t, i) { - if (i >= fcChartView.count) + if (i >= chartView.count) addFactSeries(fact); - var s = fcChartView.series(i); + var s = chartView.series(i); var value = fact.value != undefined ? fact.value : eval(fact.name); @@ -193,7 +193,7 @@ Item { } function addFactSeries(fact) { - var s = fcChartView.createSeries(ui.antialiasing ? ChartView.SeriesTypeLine : ChartView.SeriesTypeLine, fact.title, axisX, axisY); + var s = chartView.createSeries(ui.antialiasing ? ChartView.SeriesTypeLine : ChartView.SeriesTypeLine, fact.title, axisX, axisY); s.useOpenGL = Qt.binding(function () { return openGL; }); diff --git a/src/Plugins/Tools/FilteredCharts/FcColorChooser.qml b/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml similarity index 100% rename from src/Plugins/Tools/FilteredCharts/FcColorChooser.qml rename to src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml similarity index 98% rename from src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml rename to src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml index 5469e0a45..94a8ca466 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml @@ -111,6 +111,6 @@ Fact { title: qsTr("Save") enabled: !mChart.newItem && changes icon: "check-circle" - onTriggered: fcControl.saveSettings() + onTriggered: sgControl.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml similarity index 98% rename from src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml rename to src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml index bd10ce9bc..6059d8ac0 100644 --- a/src/Plugins/Tools/FilteredCharts/FcFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml @@ -97,6 +97,6 @@ Fact { title: qsTr("Save") enabled: !mChart.newItem && changes icon: "check-circle" - onTriggered: fcControl.saveSettings() + onTriggered: sgControl.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml similarity index 97% rename from src/Plugins/Tools/FilteredCharts/FcMenuChart.qml rename to src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index 328952405..9606c6a27 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -142,7 +142,7 @@ Fact { mChart.opts = opt; mColor.changes = false; pageFact.updateBtnValues(); - fcCharts.updateSeriesColor(); + sgCharts.updateSeriesColor(); } function updateValue() { @@ -246,13 +246,13 @@ Fact { flags: Fact.Text onTextChanged: changes = true } - FcMenuColor { + SignalsMenuColor { id: mColor name: "color" title: qsTr("Color") descr: qsTr("Chart color") } - FcMenuFilters { + SignalsMenuFilters { id: mFilters name: "filt" title: qsTr("Filters") @@ -290,7 +290,7 @@ Fact { flags: Fact.Int units: "mandala" onTextChanged: { - fcControl.checkScrMatches(text); + sgControl.checkScrMatches(text); changes = true; } } @@ -312,7 +312,7 @@ Fact { title: qsTr("Save") enabled: !newItem && !mAdd.enabled && changes icon: "check-circle" - onTriggered: fcControl.saveSettings() + onTriggered: sgControl.saveSettings() } Fact { flags: (Fact.Action | Fact.Remove) diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuColor.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml similarity index 92% rename from src/Plugins/Tools/FilteredCharts/FcMenuColor.qml rename to src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml index d3c2b58e4..53bd9c641 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuColor.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml @@ -32,7 +32,7 @@ Fact { onChangesChanged: { if (changes) mChart.changes = true;} Component.onCompleted: { var opt = opts; - opt.page = "qrc:/FilteredCharts/FcColorChooser.qml"; + opt.page = "qrc:/FilteredCharts/SignalsColorChooser.qml"; opts = opt; } @@ -42,6 +42,6 @@ Fact { title: qsTr("Save") enabled: !mChart.newItem && changes icon: "check-circle" - onTriggered: fcControl.saveSettings() + onTriggered: sgControl.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml similarity index 96% rename from src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml rename to src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml index bd1080cef..1be11da50 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml @@ -93,13 +93,13 @@ Fact { onTextChanged: fMenu.value = text onValueChanged: changes = true // combobox index changed } - FcFilterRunningAvg { + SignalsFilterRunningAvg { id: fRunningAvg name: "running_avg" title: qsTr("Running average") descr: qsTr("Running average filter settings") } - FcFilterKalmanSimple { + SignalsFilterKalmanSimple { id: fKalmanSimple name: "kalman_smp" title: qsTr("Kalman simple") @@ -112,6 +112,6 @@ Fact { title: qsTr("Save") enabled: !mChart.newItem && changes icon: "check-circle" - onTriggered: fcControl.saveSettings() + onTriggered: sgControl.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/FcMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml similarity index 90% rename from src/Plugins/Tools/FilteredCharts/FcMenuPage.qml rename to src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index d5b3327c6..2dc3f8b09 100644 --- a/src/Plugins/Tools/FilteredCharts/FcMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -27,7 +27,7 @@ Fact { id: pageFact flags: (Fact.Group | Fact.FlatModel) - title: "Page #" + fcBtn.text + title: "Page #" + sgBtn.text property bool changes: false property alias speed: msSpeed.value @@ -40,10 +40,10 @@ Fact { } function updateBtnValues() { - fcBtn.values = []; + sgBtn.values = []; for (var i = 0; i < msValues.size; ++i) - fcBtn.values.push(msValues.child(i)); - fcBtn.updateToolTip(fcBtn.values); + sgBtn.values.push(msValues.child(i)); + sgBtn.updateToolTip(sgBtn.values); } function updateChartsValues() { @@ -89,7 +89,7 @@ Fact { return; if (mchart.bind === "") return; - var c = createFact(msValues, "FcMenuChart.qml", { + var c = createFact(msValues, "SignalsMenuChart.qml", { "data": mchart }); c.removeTriggered.connect(function () { @@ -138,13 +138,13 @@ Fact { min: 0.2 max: 4 onValueChanged: { - if (!fcBtn.checked) + if (!sgBtn.checked) return; - fcCharts.speedFactorValue = value; + sgCharts.speedFactorValue = value; changes = true; } } - FcMenuChart { + SignalsMenuChart { id: msMenuChart title: qsTr("Add new chart") descr: qsTr("Creating and setting a new chart") @@ -156,7 +156,7 @@ Fact { id: msValues title: qsTr("Values") flags: (Fact.Group | Fact.Section | Fact.DragChildren) - onSizeChanged: fcCharts.resetEnable = true + onSizeChanged: sgCharts.resetEnable = true } // Actions @@ -165,6 +165,6 @@ Fact { title: qsTr("Save") visible: changes icon: "check-circle" - onTriggered: fcControl.saveSettings() + onTriggered: sgControl.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml new file mode 100644 index 000000000..a1fb11c05 --- /dev/null +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -0,0 +1,170 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick + +import APX.Facts + +Fact { + id: chartFact + + flags: (Fact.Group | Fact.FlatModel) + title: "Charts #" + sigBtn.text + + property bool changes: false + property alias speed: msSpeed.value + property var values //from config + + Component.onDestruction: removed() // pinned menu closes when the plugin is closed + + function addNewChart() { + msMenuChart.trigger(); + } + + function updateBtnValues() { + sigBtn.values = []; + for (var i = 0; i < msValues.size; ++i) + sigBtn.values.push(msValues.child(i)); + sigBtn.updateToolTip(sigBtn.values); + } + + function updateChartsValues() { + for (var i = 0; i < msValues.size; ++i) + msValues.child(i).updateValue(); + } + + function save() { + changes = false; + var tmpValues = []; + for (var i = 0; i < msValues.size; ++i) { + var mchart = msValues.child(i).save(); + if (!mchart.bind) + continue; + tmpValues.push(mchart); + } + var set = {}; + set.title = msTitle.value; + set.speed = msSpeed.value; + set.values = tmpValues; + updateBtnValues(); + return set; + } + + function load(set) { + msTitle.value = set.title; + msSpeed.value = set.speed; + values = set.values; + updateSetItems(); + changes = false; + } + + function updateSetItems() { + msValues.deleteChildren(); + for (var i in values) { + createChart(values[i]); + } + updateBtnValues(); + } + + function createChart(mchart) { + if (!mchart.bind) + return; + if (mchart.bind === "") + return; + var c = createFact(msValues, "SignalMenuChart.qml", { + "data": mchart + }); + c.removeTriggered.connect(function () { + changes = true; + }); + changes = true; + } + + function createFact(parent, url, opts) { + var component = Qt.createComponent(url); + if (component.status === Component.Ready) { + var c = component.createObject(parent, opts); + c.parentFact = parent; + return c; + } + } + + function checkScrs(val) { + var matches = false; + for (var i = 0; i < msValues.size; ++i) + if (msValues.child(i).hasScr(val)) + matches = true; + return matches; + } + + Fact { + id: msTitle + title: qsTr("Title") + descr: qsTr("Charts title") + flags: Fact.Text + icon: "rename-box" + value: chartFact.title + onValueChanged: { + chartFact.title = value; + changes = true; + } + } + Fact { + id: msSpeed + title: qsTr("Speed") + descr: qsTr("Charts speed") + flags: Fact.Float + icon: "speedometer" + value: 1.0 + precision: 1 + min: 0.2 + max: 4 + onValueChanged: { + if (!sigBtn.checked) + return; + sgCharts.speedFactorValue = value; + changes = true; + } + } + SignalsMenuChart { + id: msMenuChart + title: qsTr("Add new chart") + descr: qsTr("Creating and setting a new chart") + icon: "plus-circle" + newItem: true + onAddTriggered: createChart(save()) + } + Fact { + id: msValues + title: qsTr("Values") + flags: (Fact.Group | Fact.Section | Fact.DragChildren) + onSizeChanged: sgCharts.resetEnable = true + } + + // Actions + Fact { + flags: (Fact.Action | Fact.Apply) + title: qsTr("Save") + visible: changes + icon: "check-circle" + onTriggered: sgControl.saveSettings() + } +} From 3fa1e588e2d64c2edc9fc283a4331c758006239a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 25 Apr 2026 04:02:30 +0300 Subject: [PATCH 070/163] Signals menu and menu set added. --- .../Tools/FilteredCharts/SignalsMenu.qml | 170 ++++++++++++++++++ .../Tools/FilteredCharts/SignalsMenuPage.qml | 46 ++--- .../Tools/FilteredCharts/SignalsMenuSet.qml | 143 ++++++++------- 3 files changed, 264 insertions(+), 95 deletions(-) create mode 100644 src/Plugins/Tools/FilteredCharts/SignalsMenu.qml diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml new file mode 100644 index 000000000..dd40065d1 --- /dev/null +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -0,0 +1,170 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick + +import APX.Facts + +Fact { + id: sgMenu + property var defaults + property string settingsName + property bool destroyOnClose: true + + name: settingsName + flags: (Fact.Group | Fact.DragChildren) + title: qsTr("Signals") + descr: qsTr("Realtime chart configuration editor") + icon: "gauge" + + signal accepted() + + Component.onCompleted: open() + + function open() { + //ensure mandala linked to unit + if(!parentFact){ + var p=parent + parentFact=apx.fleet.local + parent=p + } + loadSettings() + } + + function close() + { + if(!destroyOnClose){ + sgMenu.deleteChildren() + loadSettings() + menuBack() + return + } + sgMenu.deleteChildren() + menuBack() + parentFact=null + } + + function loadSettings() + { + var sets=[] + var f=application.prefs.loadFile("signals_2.json") + var json=f?JSON.parse(f):{} + var set={} + var currentSetIdx=-1 + if(json && json.sets){ + for(var i in json.sets){ + set=json.sets[i] + if(!(set.values && (set.values instanceof Array))) continue + sets.push(set) + } + //set index + var setIdx=json.active[settingsName] + if(setIdx>=0 && setIdx0) + currentSetIdx=0 + } + //defaults + if(sets.length<=0 || !json.active){ + set={} + set.title=settingsName + set.values=defaults + sets.push(set) + currentSetIdx=sets.length-1 + } + + //create facts + for(i in sets){ + var c=createFact(sgMenu, "SignalsMenuSet.qml", sets[i]) + c.selected.connect(select) + c.selected.connect(saveSettings) + } + select(currentSetIdx) + } + + function saveSettings() + { + var fjson=application.prefs.loadFile("signals_2.json") // TODO Refactor file name + var json=fjson?JSON.parse(fjson):{ + if(!json.active)json.active={} + json.active[settingsName]=0 + json.sets=[] + for(var i=0;i Date: Sat, 25 Apr 2026 14:40:48 +0300 Subject: [PATCH 071/163] Addition and delition sets to SignalsMenu. --- .../Tools/FilteredCharts/FilteredCharts.qml | 9 + .../Tools/FilteredCharts/SignalsMenu.qml | 197 +++++++++--------- .../Tools/FilteredCharts/SignalsMenuSet.qml | 36 ++-- 3 files changed, 125 insertions(+), 117 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index aac3a82da..aa520014f 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -174,6 +174,15 @@ Rectangle { values: [] } + TextButton { + text: "+" + onClicked: sgMenu.trigger() + + SignalsMenu { + id: sgMenu + } + } + TextButton { text: sgCharts.speedFactorValue + "x" Layout.fillHeight: true diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index dd40065d1..9cffe0ed1 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -35,123 +35,122 @@ Fact { descr: qsTr("Realtime chart configuration editor") icon: "gauge" - signal accepted() + // signal accepted - Component.onCompleted: open() + // Component.onCompleted: open() - function open() { - //ensure mandala linked to unit - if(!parentFact){ - var p=parent - parentFact=apx.fleet.local - parent=p - } - loadSettings() - } + // function open() { + // //ensure mandala linked to unit + // if (!parentFact) { + // var p = parent; + // parentFact = apx.fleet.local; + // parent = p; + // } + // loadSettings(); + // } - function close() - { - if(!destroyOnClose){ - sgMenu.deleteChildren() - loadSettings() - menuBack() - return - } - sgMenu.deleteChildren() - menuBack() - parentFact=null - } + // function close() { + // if (!destroyOnClose) { + // sgMenu.deleteChildren(); + // loadSettings(); + // menuBack(); + // return; + // } + // sgMenu.deleteChildren(); + // menuBack(); + // parentFact = null; + // } - function loadSettings() - { - var sets=[] - var f=application.prefs.loadFile("signals_2.json") - var json=f?JSON.parse(f):{} - var set={} - var currentSetIdx=-1 - if(json && json.sets){ - for(var i in json.sets){ - set=json.sets[i] - if(!(set.values && (set.values instanceof Array))) continue - sets.push(set) - } - //set index - var setIdx=json.active[settingsName] - if(setIdx>=0 && setIdx0) - currentSetIdx=0 - } - //defaults - if(sets.length<=0 || !json.active){ - set={} - set.title=settingsName - set.values=defaults - sets.push(set) - currentSetIdx=sets.length-1 - } + // function loadSettings() { + // var sets = []; + // var f = application.prefs.loadFile("signals_2.json"); + // var json = f ? JSON.parse(f) : {}; + // var set = {}; + // var currentSetIdx = -1; + // if (json && json.sets) { + // for (var i in json.sets) { + // set = json.sets[i]; + // if (!(set.values && (set.values instanceof Array))) + // continue; + // sets.push(set); + // } + // //set index + // var setIdx = json.active[settingsName]; + // if (setIdx >= 0 && setIdx < sets.length) + // currentSetIdx = setIdx; + // else if (sets.length > 0) + // currentSetIdx = 0; + // } + // //defaults + // if (sets.length <= 0 || !json.active) { + // set = {}; + // set.title = settingsName; + // set.values = defaults; + // sets.push(set); + // currentSetIdx = sets.length - 1; + // } - //create facts - for(i in sets){ - var c=createFact(sgMenu, "SignalsMenuSet.qml", sets[i]) - c.selected.connect(select) - c.selected.connect(saveSettings) - } - select(currentSetIdx) - } + // //create facts + // for (i in sets) { + // var c = createFact(sgMenu, "SignalsMenuSet.qml", sets[i]); + // c.selected.connect(select); + // c.selected.connect(saveSettings); + // } + // select(currentSetIdx); + // } - function saveSettings() - { - var fjson=application.prefs.loadFile("signals_2.json") // TODO Refactor file name - var json=fjson?JSON.parse(fjson):{ - if(!json.active)json.active={} - json.active[settingsName]=0 - json.sets=[] - for(var i=0;i Date: Sat, 25 Apr 2026 18:10:45 +0300 Subject: [PATCH 072/163] Add menu set not finished. --- .../Tools/FilteredCharts/SignalsMenuPage.qml | 61 +++++++++++----- .../Tools/FilteredCharts/SignalsMenuSet.qml | 70 +++++++++---------- 2 files changed, 79 insertions(+), 52 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index f7b9f1e35..bd35c4dac 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -27,23 +27,32 @@ Fact { id: pageFact flags: (Fact.Group | Fact.FlatModel) - title: "Page #" + sgBtn.text + property var newItem: false property bool changes: false property alias speed: msSpeed.value property var values //from config + signal addTriggered + signal removeTriggered + Component.onDestruction: removed() // pinned menu closes when the plugin is closed + function updateTitle() { + if (newItem) + return; + pageFact.title = msPageName.value ? msPageName.value : "Page #" + pageFact.num; + } + function addNewChart() { mMenuChart.trigger(); } function updateBtnValues() { - sgBtn.values = []; - for (var i = 0; i < mCharts.size; ++i) - sgBtn.values.push(mCharts.child(i)); - sgBtn.updateToolTip(sgBtn.values); + // sgBtn.values = []; + // for (var i = 0; i < mCharts.size; ++i) + // sgBtn.values.push(mCharts.child(i)); + // sgBtn.updateToolTip(sgBtn.values); } function updateChartsValues() { @@ -60,8 +69,8 @@ Fact { continue; tmpValues.push(mchart); } - var page = {}; - page.title = msTitle.value; + var set = {}; + page.title = msPageName.value; page.speed = msSpeed.value; page.values = tmpValues; updateBtnValues(); @@ -69,7 +78,7 @@ Fact { } function load(page) { - msTitle.value = page.title; + msPageName.value = page.title; msSpeed.value = page.speed; values = page.values; updateSetItems(); @@ -116,16 +125,13 @@ Fact { } Fact { - id: msTitle - title: qsTr("Title") - descr: qsTr("Charts title") + id: msPageName + title: qsTr("Page name") + descr: qsTr("Charts page name") flags: Fact.Text icon: "rename-box" - value: pageFact.title - onValueChanged: { - pageFact.title = value; - changes = true; - } + value: "Page #" + pageFact.num + onValueChanged: updateTitle() } Fact { id: msSpeed @@ -160,11 +166,32 @@ Fact { } // Actions + Fact { + id: pageAdd + flags: (Fact.Action | Fact.Apply) + title: qsTr("Add") + enabled: newItem + icon: "plus-circle" + onTriggered: { + pageFact.menuBack(); + addTriggered(); + } + } Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - visible: changes + enabled: !newItem icon: "check-circle" onTriggered: sgControl.saveSettings() } + Fact { + flags: (Fact.Action | Fact.Remove) + title: qsTr("Remove") + visible: !newItem + icon: "delete" + onTriggered: { + removeTriggered(); + pageFact.deleteFact(); + } + } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index ce10996d6..5f2689b26 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -24,7 +24,7 @@ import QtQuick import APX.Facts Fact { - id: mSet + id: setFact flags: (Fact.Group | Fact.FlatModel) title: "Set" @@ -64,41 +64,40 @@ Fact { tmpPages.push(mpage); } var set = {}; - set.title = msTitle.value; - set.speed = msSpeed.value; + set.title = msName.value; set.values = tmpValues; - // updateBtnValues(); return set; } function load(set) { - msTitle.value = set.title; - msSpeed.value = set.speed; - values = set.values; - updateSetItems(); - changes = false; + // msName.value = set.title; + // msSpeed.value = set.speed; + // values = set.values; + // updateSetItems(); + // changes = false; } function updateSetItems() { - mPages.deleteChildren(); - for (var i in values) { - createChart(values[i]); - } - // updateBtnValues(); + // mPages.deleteChildren(); + // for (var i in values) { + // createPage(values[i]); + // } } - function createPage(mset) { - if (!mset.bind) - return; - if (mset.bind === "") - return; - var c = createFact(mSet, "SignalsMenuPage.qml", { - "data": mset - }); - c.removeTriggered.connect(function () { - // changes = true; - }); - // changes = true; + // function createPage(mset) { + function createPage() { + // var c = createFact(setFact, "SignalsMenuPage.qml", { + // "data": mset + // }); + var page = {}; + page.values = []; + var c = createFact(mPages, "SignalsMenuPage.qml", page); + // c.trigger(); + + // c.removeTriggered.connect(function () { + // // changes = true; + // }); + // // changes = true; } function createFact(parent, url, opts) { @@ -111,24 +110,25 @@ Fact { } Fact { - id: msTitle + id: mSetName title: qsTr("Set name") descr: qsTr("Saved chart configuration name") flags: Fact.Text icon: "rename-box" - value: mSet.title + value: setFact.title onValueChanged: { - mSet.title = value; + setFact.title = value; // changes = true; } } - SignalsMenuChart { + SignalsMenuPage { id: mMenuPage title: qsTr("Add new page") descr: qsTr("Creating and add new page") icon: "plus-circle" newItem: true - onAddTriggered: createPage(save()) + onAddTriggered: createPage() + // onAddTriggered: createPage(save()) } Fact { id: mPages @@ -143,8 +143,8 @@ Fact { title: qsTr("Save") visible: !newItem // && changes icon: "check-circle" - // onTriggered: sgControl.saveSettings() onTriggered: console.log("Not implemented") + // onTriggered: sgControl.saveSettings() } Fact { flags: (Fact.Action | Fact.Apply) @@ -152,8 +152,8 @@ Fact { visible: !setFact.active icon: "check-circle" onTriggered: { - mSet.menuBack(); - // mSet.selected(mSet.num); + setFact.menuBack(); + // setFact.selected(setFact.num); } } Fact { @@ -163,7 +163,7 @@ Fact { icon: "delete" onTriggered: { removeTriggered(); - mSet.deleteFact(); + setFact.deleteFact(); } } } From 70e61bd7d66c90da8978cc2855630d161777c208 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 25 Apr 2026 21:03:05 +0300 Subject: [PATCH 073/163] Set menu and charts warning field added. --- .../Tools/FilteredCharts/SignalsMenuChart.qml | 18 -------- .../Tools/FilteredCharts/SignalsMenuPage.qml | 46 ++++++++++++------- .../Tools/FilteredCharts/SignalsMenuSet.qml | 32 ++++++------- 3 files changed, 45 insertions(+), 51 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index 9606c6a27..3c2a0c3d6 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -263,24 +263,6 @@ Fact { title: qsTr("Warning") descr: qsTr("Expression for warning") flags: Fact.Text - enabled: false - visible: false - } - Fact { - name: "alarm" - title: qsTr("Alarm") - descr: "value>1.8 || (value>0 && value<1)" - flags: Fact.Text - enabled: false - visible: false - } - Fact { - name: "act" - title: qsTr("Action") - descr: "cmd.proc.action=proc_action_reset" - flags: Fact.Text - enabled: false - visible: false } Fact { id: mFact2Save diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index bd35c4dac..9c6caeeb7 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -30,20 +30,23 @@ Fact { property var newItem: false property bool changes: false - property alias speed: msSpeed.value + property alias speed: mSpeed.value property var values //from config + property var data: ({}) + + onNumChanged: updateTitle() signal addTriggered signal removeTriggered Component.onDestruction: removed() // pinned menu closes when the plugin is closed - - function updateTitle() { - if (newItem) - return; - pageFact.title = msPageName.value ? msPageName.value : "Page #" + pageFact.num; + Component.onCompleted: { + load(data); + updateTitle(); + updateDescr(); } + function addNewChart() { mMenuChart.trigger(); } @@ -69,17 +72,17 @@ Fact { continue; tmpValues.push(mchart); } - var set = {}; - page.title = msPageName.value; - page.speed = msSpeed.value; + var page = {}; + page.title = mPageName.value; + page.speed = mSpeed.value; page.values = tmpValues; updateBtnValues(); return page; } function load(page) { - msPageName.value = page.title; - msSpeed.value = page.speed; + mPageName.value = page.title; + mSpeed.value = page.speed; values = page.values; updateSetItems(); changes = false; @@ -124,17 +127,28 @@ Fact { return matches; } + function updateTitle() { + if (newItem) + return; + var text = mPageName.text.trim(); + title = text != "" ? text : qsTr("Page") + " " + (Math.max(pageFact.num, 0) + 1) + } + + function updateDescr() { + + } + Fact { - id: msPageName + id: mPageName title: qsTr("Page name") descr: qsTr("Charts page name") flags: Fact.Text icon: "rename-box" - value: "Page #" + pageFact.num - onValueChanged: updateTitle() + value: qsTr("Page") + " " + (mPages.size + 1) + onTextChanged: updateTitle() } Fact { - id: msSpeed + id: mSpeed title: qsTr("Speed") descr: qsTr("Charts speed") flags: Fact.Float @@ -144,7 +158,7 @@ Fact { min: 0.2 max: 4 onValueChanged: { - if (!sgBtn.checked) + if (!sgBtn || !sgBtn.checked) return; sgCharts.speedFactorValue = value; changes = true; diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 5f2689b26..ce59c69b0 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -32,7 +32,7 @@ Fact { property bool newItem: false // property bool changes: false // property var values //from config - property var pages + property var values signal removeTriggered @@ -56,22 +56,20 @@ Fact { function save() { // changes = false; - var tmpPages = []; + var tmpValues = []; for (var i = 0; i < mPages.size; ++i) { var mpage = mPages.child(i).save(); - if (!mpage.bind) - continue; tmpPages.push(mpage); } var set = {}; - set.title = msName.value; + set.title = mSetName.value; set.values = tmpValues; return set; } function load(set) { - // msName.value = set.title; - // msSpeed.value = set.speed; + // mSetName.value = set.title; + // mSpeed.value = set.speed; // values = set.values; // updateSetItems(); // changes = false; @@ -84,14 +82,14 @@ Fact { // } } - // function createPage(mset) { - function createPage() { - // var c = createFact(setFact, "SignalsMenuPage.qml", { - // "data": mset - // }); - var page = {}; - page.values = []; - var c = createFact(mPages, "SignalsMenuPage.qml", page); + function createPage(mset) { + // function createPage() { + var c = createFact(mPages, "SignalsMenuPage.qml", { + "data": mset + }); + // var page = {}; + // page.values = []; + // var c = createFact(mPages, "SignalsMenuPage.qml", page); // c.trigger(); // c.removeTriggered.connect(function () { @@ -127,8 +125,8 @@ Fact { descr: qsTr("Creating and add new page") icon: "plus-circle" newItem: true - onAddTriggered: createPage() - // onAddTriggered: createPage(save()) + // onAddTriggered: createPage() + onAddTriggered: createPage(save()) } Fact { id: mPages From 3f714240afc7bfe82f8e484644531fcec981ec2a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 26 Apr 2026 15:13:48 +0300 Subject: [PATCH 074/163] Signals menu, sets and pages updated. --- .../Tools/FilteredCharts/SignalsMenu.qml | 6 ++++-- .../Tools/FilteredCharts/SignalsMenuPage.qml | 12 ++++------- .../Tools/FilteredCharts/SignalsMenuSet.qml | 21 ++++++++++++------- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 9cffe0ed1..6d2e48f30 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -138,9 +138,11 @@ Fact { function createSet() { var set = {}; - set.title = "#" + (sgMenu.size + 1); + set.title = "Set" + (sgMenu.size + 1); set.values = []; - var c = createFact(sgMenu, "SignalsMenuSet.qml", set); + var c = createFact(sgMenu, "SignalsMenuSet.qml", { + "data": set + }); // c.selected.connect(select); // c.selected.connect(saveSettings); c.trigger(); diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 9c6caeeb7..9b1af739d 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -34,8 +34,6 @@ Fact { property var values //from config property var data: ({}) - onNumChanged: updateTitle() - signal addTriggered signal removeTriggered @@ -46,7 +44,6 @@ Fact { updateDescr(); } - function addNewChart() { mMenuChart.trigger(); } @@ -81,8 +78,9 @@ Fact { } function load(page) { + console.log("page: ", JSON.stringify(data)); mPageName.value = page.title; - mSpeed.value = page.speed; + mSpeed.value = page.speed ? page.speed : 1; values = page.values; updateSetItems(); changes = false; @@ -130,12 +128,11 @@ Fact { function updateTitle() { if (newItem) return; - var text = mPageName.text.trim(); - title = text != "" ? text : qsTr("Page") + " " + (Math.max(pageFact.num, 0) + 1) + var text = mPageName.text.trim(); + title = text != "" ? text : qsTr("P") + (Math.max(pageFact.num, 0) + 1); } function updateDescr() { - } Fact { @@ -144,7 +141,6 @@ Fact { descr: qsTr("Charts page name") flags: Fact.Text icon: "rename-box" - value: qsTr("Page") + " " + (mPages.size + 1) onTextChanged: updateTitle() } Fact { diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index ce59c69b0..763cc1d70 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -31,11 +31,12 @@ Fact { property bool newItem: false // property bool changes: false - // property var values //from config - property var values + property var values //from config + property var data: ({}) signal removeTriggered + Component.onCompleted: load(data) Component.onDestruction: removed() // pinned menu closes when the plugin is closed // function addNewPage() { @@ -59,7 +60,7 @@ Fact { var tmpValues = []; for (var i = 0; i < mPages.size; ++i) { var mpage = mPages.child(i).save(); - tmpPages.push(mpage); + tmpValues.push(mpage); } var set = {}; set.title = mSetName.value; @@ -68,8 +69,7 @@ Fact { } function load(set) { - // mSetName.value = set.title; - // mSpeed.value = set.speed; + mSetName.value = set.title; // values = set.values; // updateSetItems(); // changes = false; @@ -83,7 +83,12 @@ Fact { } function createPage(mset) { - // function createPage() { + // function createPage() { + var text = mset.title.trim(); + if (text == "") + mset.title = "P" + (mPages.size + 1); + if (mset.speed <= 0) + mset.speed = 1; var c = createFact(mPages, "SignalsMenuPage.qml", { "data": mset }); @@ -99,9 +104,12 @@ Fact { } function createFact(parent, url, opts) { + console.log("Start create component"); var component = Qt.createComponent(url); if (component.status === Component.Ready) { + console.log("Start create object"); var c = component.createObject(parent, opts); + console.log("Set parent"); c.parentFact = parent; return c; } @@ -113,7 +121,6 @@ Fact { descr: qsTr("Saved chart configuration name") flags: Fact.Text icon: "rename-box" - value: setFact.title onValueChanged: { setFact.title = value; // changes = true; From 3e5b662d224e7c705b16059ebb87a1448a14675c Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 26 Apr 2026 16:31:42 +0300 Subject: [PATCH 075/163] Add set and page description. --- .../Tools/FilteredCharts/SignalsMenuPage.qml | 27 ++++++++++++++++++- .../Tools/FilteredCharts/SignalsMenuSet.qml | 14 +++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 9b1af739d..554d8711b 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -133,6 +133,23 @@ Fact { } function updateDescr() { + var descrList = []; + var speedDescr = "SPEED: " + mSpeed.value; + descrList.push(speedDescr); + var descrCharts = []; + for (var i = 0; i < mCharts.size; ++i) { + var f = mCharts.child(i); + if (!f) + continue; + var text = f.title ? f.title.trim() : ""; + descrCharts.push(text); + } + if (descrCharts.length > 0) { + var chartsDescr = descrCharts.join(", "); + chartsDescr = "CHARTS: " + chartsDescr; + descrList.push(chartsDescr); + } + descr = descrList.length > 0 ? descrList.join(", ") : ""; } Fact { @@ -154,6 +171,9 @@ Fact { min: 0.2 max: 4 onValueChanged: { + // New functionality + updateDescr(); + // ================= if (!sgBtn || !sgBtn.checked) return; sgCharts.speedFactorValue = value; @@ -172,7 +192,12 @@ Fact { id: mCharts title: qsTr("Charts") flags: (Fact.Group | Fact.Section | Fact.DragChildren) - onSizeChanged: sgCharts.resetEnable = true + onSizeChanged: { + // New functionality + updateDescr(); + // ================= + sgCharts.resetEnable = true; + } } // Actions diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 763cc1d70..218ffe4b3 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -115,6 +115,18 @@ Fact { } } + function updateDescr() { + var descrList = []; + for (var i = 0; i < mPages.size; ++i) { + var f = mPages.child(i); + if (!f) + continue; + var text = f.title ? f.title.trim() : ""; + descrList.push(text); + } + descr = descrList.length > 0 ? descrList.join(", ") : ""; + } + Fact { id: mSetName title: qsTr("Set name") @@ -139,7 +151,7 @@ Fact { id: mPages title: qsTr("Pages") flags: (Fact.Group | Fact.Section | Fact.DragChildren) - // onSizeChanged: sgCharts.resetEnable = true + onSizeChanged: updateDescr() } // Actions From 2fe6e1dacb65ec9b3f46d7617fdef7a494580e6a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 26 Apr 2026 18:03:22 +0300 Subject: [PATCH 076/163] Set selection added. --- src/Plugins/Tools/FilteredCharts/SignalsMenu.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml | 11 +++++++++++ src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml | 6 ++---- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 6d2e48f30..f9fc3e0e9 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -143,7 +143,7 @@ Fact { var c = createFact(sgMenu, "SignalsMenuSet.qml", { "data": set }); - // c.selected.connect(select); + c.selected.connect(select); // c.selected.connect(saveSettings); c.trigger(); } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index 3c2a0c3d6..08b02d300 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -238,6 +238,17 @@ Fact { flags: Fact.Text onTextChanged: changes = true } + // Fact { + // id: mFact + // title: qsTr("Binding") + // descr: qsTr("Fact value") + // flags: Fact.Int + // units: "mandala" + // onTextChanged: { + // if (value) + // mBind.setValue(text); + // } + // } Fact { id: mBind name: "bind" diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 554d8711b..83b0c4bcf 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -78,7 +78,7 @@ Fact { } function load(page) { - console.log("page: ", JSON.stringify(data)); + // console.log("page: ", JSON.stringify(data)); mPageName.value = page.title; mSpeed.value = page.speed ? page.speed : 1; values = page.values; diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 218ffe4b3..e358d3a23 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -34,6 +34,7 @@ Fact { property var values //from config property var data: ({}) + signal selected(var num) signal removeTriggered Component.onCompleted: load(data) @@ -104,12 +105,9 @@ Fact { } function createFact(parent, url, opts) { - console.log("Start create component"); var component = Qt.createComponent(url); if (component.status === Component.Ready) { - console.log("Start create object"); var c = component.createObject(parent, opts); - console.log("Set parent"); c.parentFact = parent; return c; } @@ -169,8 +167,8 @@ Fact { visible: !setFact.active icon: "check-circle" onTriggered: { + setFact.selected(setFact.num); setFact.menuBack(); - // setFact.selected(setFact.num); } } Fact { From 15af020309a9b28469f3e798415ac3a0916c5a4c Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 26 Apr 2026 19:29:35 +0300 Subject: [PATCH 077/163] Save signals settings implemented. --- .../Tools/FilteredCharts/SignalsMenu.qml | 48 +++++++++---------- .../Tools/FilteredCharts/SignalsMenuSet.qml | 4 +- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index f9fc3e0e9..78ef8a975 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -26,10 +26,9 @@ import APX.Facts Fact { id: sgMenu property var defaults - property string settingsName property bool destroyOnClose: true - name: settingsName + name: "signals" flags: (Fact.Group | Fact.DragChildren) title: qsTr("Signals") descr: qsTr("Realtime chart configuration editor") @@ -99,26 +98,26 @@ Fact { // select(currentSetIdx); // } - // function saveSettings() - // { - // var fjson = application.prefs.loadFile("signals_2.json"); // TODO Refactor file name - // var json =fjson ? JSON.parse(fjson):{ - // if (!json.active)json.active={} - // json.active[settingsName]=0 - // json.sets=[] - // for(var i=0;i Date: Sun, 26 Apr 2026 20:07:10 +0300 Subject: [PATCH 078/163] Setting loading. --- .../Tools/FilteredCharts/SignalsMenu.qml | 77 ++++++++++--------- .../Tools/FilteredCharts/SignalsMenuSet.qml | 13 ++-- 2 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 78ef8a975..ba6085ea1 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -38,6 +38,8 @@ Fact { // Component.onCompleted: open() + Component.onCompleted: loadSettings() + // function open() { // //ensure mandala linked to unit // if (!parentFact) { @@ -60,43 +62,46 @@ Fact { // parentFact = null; // } - // function loadSettings() { - // var sets = []; - // var f = application.prefs.loadFile("signals_2.json"); - // var json = f ? JSON.parse(f) : {}; - // var set = {}; - // var currentSetIdx = -1; - // if (json && json.sets) { - // for (var i in json.sets) { - // set = json.sets[i]; - // if (!(set.values && (set.values instanceof Array))) - // continue; - // sets.push(set); - // } - // //set index - // var setIdx = json.active[settingsName]; - // if (setIdx >= 0 && setIdx < sets.length) - // currentSetIdx = setIdx; - // else if (sets.length > 0) - // currentSetIdx = 0; - // } - // //defaults - // if (sets.length <= 0 || !json.active) { - // set = {}; - // set.title = settingsName; - // set.values = defaults; - // sets.push(set); - // currentSetIdx = sets.length - 1; - // } + function loadSettings() { + var sets = []; + var f = application.prefs.loadFile("signals_2.json"); + var json = f ? JSON.parse(f) : {}; + var set = {}; + var currentSetIdx = -1; + if (json && json.sets) { + for (var i in json.sets) { + set = json.sets[i]; + if (!(set.values && (set.values instanceof Array))) + continue; + sets.push(set); + } + //set index + var setIdx = json.active[name]; + if (setIdx >= 0 && setIdx < sets.length) + currentSetIdx = setIdx; + else if (sets.length > 0) + currentSetIdx = 0; + } + //defaults + // if (sets.length <= 0 || !json.active) { + // createDefault(); + // set = {}; + // set.title = settingsName; + // set.values = defaults; + // sets.push(set); + // currentSetIdx = sets.length - 1; + // } - // //create facts - // for (i in sets) { - // var c = createFact(sgMenu, "SignalsMenuSet.qml", sets[i]); - // c.selected.connect(select); - // c.selected.connect(saveSettings); - // } - // select(currentSetIdx); - // } + //create facts + for (i in sets) { + var c = createFact(sgMenu, "SignalsMenuSet.qml", { + "data": sets[i] + }); + c.selected.connect(select); + c.selected.connect(saveSettings); + } + select(currentSetIdx); + } function saveSettings() { var fjson = application.prefs.loadFile("signals_2.json"); diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 391e48225..5ffee1843 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -71,16 +71,17 @@ Fact { function load(set) { mSetName.value = set.title; - // values = set.values; - // updateSetItems(); + values = set.values; + console.log("load set", JSON.stringify(values)); + updateSetItems(); // changes = false; } function updateSetItems() { - // mPages.deleteChildren(); - // for (var i in values) { - // createPage(values[i]); - // } + mPages.deleteChildren(); + for (var i in values) { + createPage(values[i]); + } } function createPage(mset) { From 38a85d7720f0e0aef7f697415876819db4062d1a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 26 Apr 2026 20:39:33 +0300 Subject: [PATCH 079/163] Sets and pages refactoring. --- .../Tools/FilteredCharts/SignalsMenu.qml | 74 +++++++++++++++++-- .../Tools/FilteredCharts/SignalsMenuPage.qml | 14 ++-- .../Tools/FilteredCharts/SignalsMenuSet.qml | 16 ++-- 3 files changed, 82 insertions(+), 22 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index ba6085ea1..3ff41e71f 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -62,6 +62,66 @@ Fact { // parentFact = null; // } + function createDefaultSet() { + var specs = [ + { + "name": "R", + "bindings": ["cmd.att.roll", "est.att.roll"] + }, + { + "name": "P", + "bindings": ["cmd.att.pitch", "est.att.pitch"] + }, + { + "name": "Y", + "bindings": ["cmd.pos.bearing", "cmd.att.yaw", "est.att.yaw"] + }, + { + "name": "Axy", + "bindings": ["est.acc.x", "est.acc.y"] + }, + { + "name": "Az", + "bindings": ["est.acc.z"] + }, + { + "name": "G", + "bindings": ["est.gyro.x", "est.gyro.y", "est.gyro.z"] + }, + { + "name": "Pt", + "bindings": ["est.pos.altitude", "est.pos.vspeed", "est.air.airspeed"] + }, + { + "name": "Ctr", + "bindings": ["ctr.att.ail", "ctr.att.elv", "ctr.att.rud", "ctr.eng.thr", "ctr.eng.prop", "ctr.str.rud"] + }, + { + "name": "RC", + "bindings": ["cmd.rc.roll", "cmd.rc.pitch", "cmd.rc.thr", "cmd.rc.yaw"] + }, + { + "name": "Usr", + "bindings": ["est.usr.u1", "est.usr.u2", "est.usr.u3", "est.usr.u4", "est.usr.u5", "est.usr.u6"] + } + ]; + var set = { + "title": "default", + "values": [] + }; + + return set; + } + + function createDefaultSignals() { + return { + "active": { + "signals": 0 + }, + "sets": [createDefaultSet()] + }; + } + function loadSettings() { var sets = []; var f = application.prefs.loadFile("signals_2.json"); @@ -71,7 +131,7 @@ Fact { if (json && json.sets) { for (var i in json.sets) { set = json.sets[i]; - if (!(set.values && (set.values instanceof Array))) + if (!(set.pages && (set.pages instanceof Array))) continue; sets.push(set); } @@ -84,12 +144,12 @@ Fact { } //defaults // if (sets.length <= 0 || !json.active) { - // createDefault(); - // set = {}; - // set.title = settingsName; - // set.values = defaults; - // sets.push(set); - // currentSetIdx = sets.length - 1; + // set = createDefaultSignals(); + // set = {}; + // set.title = "default"; + // set.values = defaults; + // // sets.push(set); + // // currentSetIdx = sets.length - 1; // } //create facts diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 83b0c4bcf..f9431f7aa 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -31,7 +31,7 @@ Fact { property var newItem: false property bool changes: false property alias speed: mSpeed.value - property var values //from config + property var charts //from config property var data: ({}) signal addTriggered @@ -62,17 +62,17 @@ Fact { function save() { changes = false; - var tmpValues = []; + var tmpCharts = []; for (var i = 0; i < mCharts.size; ++i) { var mchart = mCharts.child(i).save(); if (!mchart.bind) continue; - tmpValues.push(mchart); + tmpCharts.push(mchart); } var page = {}; page.title = mPageName.value; page.speed = mSpeed.value; - page.values = tmpValues; + page.charts = tmpCharts; updateBtnValues(); return page; } @@ -81,15 +81,15 @@ Fact { // console.log("page: ", JSON.stringify(data)); mPageName.value = page.title; mSpeed.value = page.speed ? page.speed : 1; - values = page.values; + charts = page.charts; updateSetItems(); changes = false; } function updateSetItems() { mCharts.deleteChildren(); - for (var i in values) { - createChart(values[i]); + for (var i in charts) { + createChart(charts[i]); } updateBtnValues(); } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 5ffee1843..987753ed1 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -31,7 +31,7 @@ Fact { property bool newItem: false // property bool changes: false - property var values //from config + property var pages //from config property var data: ({}) signal selected(var num) @@ -58,29 +58,29 @@ Fact { function save() { // changes = false; - var tmpValues = []; + var tmpPages = []; for (var i = 0; i < mPages.size; ++i) { var mpage = mPages.child(i).save(); - tmpValues.push(mpage); + tmpPages.push(mpage); } var set = {}; set.title = mSetName.value; - set.values = tmpValues; + set.pages = tmpPages; return set; } function load(set) { mSetName.value = set.title; - values = set.values; - console.log("load set", JSON.stringify(values)); + pages = set.pages; + console.log("load set", JSON.stringify(pages)); updateSetItems(); // changes = false; } function updateSetItems() { mPages.deleteChildren(); - for (var i in values) { - createPage(values[i]); + for (var i in pages) { + createPage(pages[i]); } } From eb1f4060754271b0bbf258172a0c7f65676969b2 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 26 Apr 2026 22:19:19 +0300 Subject: [PATCH 080/163] Add default settings. --- .../Tools/FilteredCharts/SignalsMenu.qml | 157 +++++++++++------- .../Tools/FilteredCharts/SignalsMenuChart.qml | 25 +-- .../Tools/FilteredCharts/SignalsMenuSet.qml | 2 +- 3 files changed, 112 insertions(+), 72 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 3ff41e71f..c8ec2c4fc 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -63,64 +63,104 @@ Fact { // } function createDefaultSet() { - var specs = [ - { - "name": "R", - "bindings": ["cmd.att.roll", "est.att.roll"] - }, - { - "name": "P", - "bindings": ["cmd.att.pitch", "est.att.pitch"] - }, - { - "name": "Y", - "bindings": ["cmd.pos.bearing", "cmd.att.yaw", "est.att.yaw"] - }, - { - "name": "Axy", - "bindings": ["est.acc.x", "est.acc.y"] - }, - { - "name": "Az", - "bindings": ["est.acc.z"] - }, - { - "name": "G", - "bindings": ["est.gyro.x", "est.gyro.y", "est.gyro.z"] - }, - { - "name": "Pt", - "bindings": ["est.pos.altitude", "est.pos.vspeed", "est.air.airspeed"] - }, - { - "name": "Ctr", - "bindings": ["ctr.att.ail", "ctr.att.elv", "ctr.att.rud", "ctr.eng.thr", "ctr.eng.prop", "ctr.str.rud"] - }, - { - "name": "RC", - "bindings": ["cmd.rc.roll", "cmd.rc.pitch", "cmd.rc.thr", "cmd.rc.yaw"] - }, - { - "name": "Usr", - "bindings": ["est.usr.u1", "est.usr.u2", "est.usr.u3", "est.usr.u4", "est.usr.u5", "est.usr.u6"] - } - ]; var set = { "title": "default", - "values": [] + "pages": [ + { + "title": "R", + "charts": [ + {"bind": "cmd.att.roll", "color": "#ffffff"}, + {"bind": "est.att.roll", "color": "#ffffff"}] + }, + { + "title": "P", + "charts": [ + {"bind": "cmd.att.pitch", "color": "#ffffff"}, + {"bind": "est.att.pitch", "color": "#ffffff"} + ] + }, + { + "title": "Y", + "charts": [ + {"bind": "cmd.pos.bearing", "color": "#ffffff"}, + {"bind": "cmd.att.yaw", "color": "#ffffff"}, + {"bind": "est.att.yaw", "color": "#ffffff"} + ] + }, + { + "title": "Axy", + "charts": [ + {"bind": "est.acc.x", "color": "#ffffff"}, + {"bind": "est.acc.y", "color": "#ffffff"} + ] + }, + { + "title": "Az", + "charts": [ + {"bind": "est.acc.z", "color": "#ffffff"} + ] + }, + { + "title": "G", + "charts": [ + {"bind": "est.gyro.x", "color": "#ffffff"}, + {"bind": "est.gyro.y", "color": "#ffffff"}, + {"bind": "est.gyro.z", "color": "#ffffff"} + ] + }, + { + "title": "Pt", + "charts": [ + {"bind": "est.pos.altitude", "color": "#ffffff"}, + {"bind": "est.pos.vspeed", "color": "#ffffff"}, + {"bind": "est.air.airspeed", "color": "#ffffff"} + ] + }, + { + "title": "Ctr", + "charts": [ + {"bind": "ctr.att.ail", "color": "#ffffff"}, + {"bind": "ctr.att.elv", "color": "#ffffff"}, + {"bind": "ctr.att.rud", "color": "#ffffff"}, + {"bind": "ctr.eng.thr", "color": "#ffffff"}, + {"bind": "ctr.eng.prop", "color": "#ffffff"}, + {"bind": "ctr.str.rud", "color": "#ffffff"} + ] + }, + { + "title": "RC", + "charts": [ + {"bind": "cmd.rc.roll", "color": "#ffffff"}, + {"bind": "cmd.rc.pitch", "color": "#ffffff"}, + {"bind": "cmd.rc.thr", "color": "#ffffff"}, + {"bind": "cmd.rc.yaw", "color": "#ffffff"} + ] + }, + { + "title": "Usr", + "charts": [ + {"bind": "est.usr.u1", "color": "#ffffff"}, + {"bind": "est.usr.u2", "color": "#ffffff"}, + {"bind": "est.usr.u3", "color": "#ffffff"}, + {"bind": "est.usr.u4", "color": "#ffffff"}, + {"bind": "est.usr.u5", "color": "#ffffff"}, + {"bind": "est.usr.u6", "color": "#ffffff"} + ] + } + ] }; return set; } - function createDefaultSignals() { - return { - "active": { - "signals": 0 - }, - "sets": [createDefaultSet()] - }; - } + // function createDefaultSignals() { + // return { + // "active": { + // "signals": 0 + // }, + // "sets": [createDefaultSet()] + // }; + // } function loadSettings() { var sets = []; @@ -143,17 +183,16 @@ Fact { currentSetIdx = 0; } //defaults - // if (sets.length <= 0 || !json.active) { - // set = createDefaultSignals(); - // set = {}; - // set.title = "default"; - // set.values = defaults; - // // sets.push(set); - // // currentSetIdx = sets.length - 1; - // } + if (sets.length <= 0 || !json.active) { + set = {}; + set = createDefaultSet(); + sets.push(set); + currentSetIdx = sets.length - 1; + } //create facts for (i in sets) { + console.log("set: ", JSON.stringify(sets[i])); var c = createFact(sgMenu, "SignalsMenuSet.qml", { "data": sets[i] }); diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index 08b02d300..4863e904d 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -57,7 +57,7 @@ Fact { onValueChanged: saveValue2Fact() - function load() { + function load(data) { for (var i = 0; i < mChart.size; ++i) { var f = child(i); var v = data[settingName(f)]; @@ -238,17 +238,18 @@ Fact { flags: Fact.Text onTextChanged: changes = true } - // Fact { - // id: mFact - // title: qsTr("Binding") - // descr: qsTr("Fact value") - // flags: Fact.Int - // units: "mandala" - // onTextChanged: { - // if (value) - // mBind.setValue(text); - // } - // } + Fact { + id: mFact + name: "binding" + title: qsTr("Binding") + descr: qsTr("Fact value") + flags: Fact.Int + units: "mandala" + onTextChanged: { + if (value) + mBind.setValue(text); + } + } Fact { id: mBind name: "bind" diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 987753ed1..d8a7f62eb 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -72,7 +72,7 @@ Fact { function load(set) { mSetName.value = set.title; pages = set.pages; - console.log("load set", JSON.stringify(pages)); + // console.log("load set", JSON.stringify(pages)); updateSetItems(); // changes = false; } From 4d5e6cee86861d55251e0ab9b3b70bc28fc69211 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 26 Apr 2026 23:02:34 +0300 Subject: [PATCH 081/163] Reset default set added. --- src/Plugins/Tools/FilteredCharts/SignalsMenu.qml | 12 +++++++++--- src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml | 1 - src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml | 5 ++++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index c8ec2c4fc..31efb14ed 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -192,7 +192,6 @@ Fact { //create facts for (i in sets) { - console.log("set: ", JSON.stringify(sets[i])); var c = createFact(sgMenu, "SignalsMenuSet.qml", { "data": sets[i] }); @@ -251,6 +250,14 @@ Fact { c.trigger(); } + function resetToDefaults() { + if(sgMenu.size <=0) + return; + var defaultSet = sgMenu.child(0); + defaultSet.data = createDefaultSet(); + defaultSet.load(defaultSet.data); + } + Fact { title: qsTr("Add set") flags: Fact.Action @@ -261,8 +268,7 @@ Fact { title: qsTr("Reset defaults") flags: Fact.Action icon: "restore" - // onTriggered: sgMenu.resetToDefaults() - onTriggered: console.log("Not implemented") + onTriggered: resetToDefaults() } Fact { title: qsTr("Save") diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index f9431f7aa..92239fe9d 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -78,7 +78,6 @@ Fact { } function load(page) { - // console.log("page: ", JSON.stringify(data)); mPageName.value = page.title; mSpeed.value = page.speed ? page.speed : 1; charts = page.charts; diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index d8a7f62eb..5c53c4164 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -72,7 +72,6 @@ Fact { function load(set) { mSetName.value = set.title; pages = set.pages; - // console.log("load set", JSON.stringify(pages)); updateSetItems(); // changes = false; } @@ -178,6 +177,10 @@ Fact { visible: !newItem icon: "delete" onTriggered: { + if(setFact.num <= 0) { // don't delete default set + console.warn(qsTr("Can't delete default set")) + return; + } removeTriggered(); setFact.deleteFact(); } From 568aa003abc5ddd465ee28b61bba830d6cab071a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 27 Apr 2026 01:18:04 +0300 Subject: [PATCH 082/163] Settings button fix. --- src/Plugins/Tools/FilteredCharts/FilteredCharts.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index aa520014f..39e33b341 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -174,10 +174,10 @@ Rectangle { values: [] } - TextButton { - text: "+" + IconButton { + iconName: "plus" + toolTip: qsTr("Edit chart configuration") onClicked: sgMenu.trigger() - SignalsMenu { id: sgMenu } From c64b51f75cfe6b0001488b872b6a81af685b2659 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 27 Apr 2026 04:38:28 +0300 Subject: [PATCH 083/163] Update default charts. --- .../Tools/FilteredCharts/SignalsMenu.qml | 80 +++++++------------ 1 file changed, 29 insertions(+), 51 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 31efb14ed..221defef3 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -62,90 +62,68 @@ Fact { // parentFact = null; // } + function getCharts() { + var charts = [] + for (var i = 0; i < arguments.length; i++) { + var fact = arguments[i]; + if(!fact) + continue; + if(!fact.opts) + continue; + if(!fact.opts.color) + continue; + var chart = { + "bind": fact.mpath(), + "color": fact.opts.color.toString() + } + charts.push(chart); + } + return charts; + } + function createDefaultSet() { var set = { "title": "default", "pages": [ { "title": "R", - "charts": [ - {"bind": "cmd.att.roll", "color": "#ffffff"}, - {"bind": "est.att.roll", "color": "#ffffff"}] + "charts": getCharts(mandala.cmd.att.roll, mandala.est.att.roll) }, { "title": "P", - "charts": [ - {"bind": "cmd.att.pitch", "color": "#ffffff"}, - {"bind": "est.att.pitch", "color": "#ffffff"} - ] + "charts": getCharts(mandala.cmd.att.pitch, mandala.est.att.pitch) }, { "title": "Y", - "charts": [ - {"bind": "cmd.pos.bearing", "color": "#ffffff"}, - {"bind": "cmd.att.yaw", "color": "#ffffff"}, - {"bind": "est.att.yaw", "color": "#ffffff"} - ] + "charts": getCharts(mandala.cmd.pos.bearing, mandala.cmd.att.yaw, mandala.est.att.yaw) }, { "title": "Axy", - "charts": [ - {"bind": "est.acc.x", "color": "#ffffff"}, - {"bind": "est.acc.y", "color": "#ffffff"} - ] + "charts":getCharts(mandala.est.acc.x, mandala.est.acc.y) }, { "title": "Az", - "charts": [ - {"bind": "est.acc.z", "color": "#ffffff"} - ] + "charts": getCharts(mandala.est.acc.z) }, { "title": "G", - "charts": [ - {"bind": "est.gyro.x", "color": "#ffffff"}, - {"bind": "est.gyro.y", "color": "#ffffff"}, - {"bind": "est.gyro.z", "color": "#ffffff"} - ] + "charts": getCharts(mandala.est.gyro.x, mandala.est.gyro.y, mandala.est.gyro.z) }, { "title": "Pt", - "charts": [ - {"bind": "est.pos.altitude", "color": "#ffffff"}, - {"bind": "est.pos.vspeed", "color": "#ffffff"}, - {"bind": "est.air.airspeed", "color": "#ffffff"} - ] + "charts": getCharts(mandala.est.pos.altitude, mandala.est.pos.vspeed, mandala.est.air.airspeed) }, { "title": "Ctr", - "charts": [ - {"bind": "ctr.att.ail", "color": "#ffffff"}, - {"bind": "ctr.att.elv", "color": "#ffffff"}, - {"bind": "ctr.att.rud", "color": "#ffffff"}, - {"bind": "ctr.eng.thr", "color": "#ffffff"}, - {"bind": "ctr.eng.prop", "color": "#ffffff"}, - {"bind": "ctr.str.rud", "color": "#ffffff"} - ] + "charts": getCharts(mandala.ctr.att.ail, mandala.ctr.att.elv, mandala.ctr.att.rud, mandala.ctr.eng.thr, mandala.ctr.eng.prop, mandala.ctr.str.rud) }, { "title": "RC", - "charts": [ - {"bind": "cmd.rc.roll", "color": "#ffffff"}, - {"bind": "cmd.rc.pitch", "color": "#ffffff"}, - {"bind": "cmd.rc.thr", "color": "#ffffff"}, - {"bind": "cmd.rc.yaw", "color": "#ffffff"} - ] + "charts": getCharts(mandala.cmd.rc.roll, mandala.cmd.rc.pitch, mandala.cmd.rc.thr, mandala.cmd.rc.yaw) }, { "title": "Usr", - "charts": [ - {"bind": "est.usr.u1", "color": "#ffffff"}, - {"bind": "est.usr.u2", "color": "#ffffff"}, - {"bind": "est.usr.u3", "color": "#ffffff"}, - {"bind": "est.usr.u4", "color": "#ffffff"}, - {"bind": "est.usr.u5", "color": "#ffffff"}, - {"bind": "est.usr.u6", "color": "#ffffff"} - ] + "charts": getCharts(mandala.est.usr.u1, mandala.est.usr.u2, mandala.est.usr.u3, mandala.est.usr.u4, mandala.est.usr.u5, mandala.est.usr.u6) } ] }; From 6a7c3886f64fdfb611c119d8ec4992695bac89cb Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 28 Apr 2026 15:36:10 +0300 Subject: [PATCH 084/163] Forvard facts from active set to signals. --- .../Tools/FilteredCharts/FilteredCharts.qml | 140 ++++++++++++------ .../Tools/FilteredCharts/SignalsButton.qml | 31 ++-- .../Tools/FilteredCharts/SignalsMenu.qml | 52 +++++-- .../Tools/FilteredCharts/SignalsMenuPage.qml | 8 +- .../Tools/FilteredCharts/SignalsMenuSet.qml | 15 +- 5 files changed, 166 insertions(+), 80 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 39e33b341..1fa627a00 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -35,6 +35,8 @@ Rectangle { border.width: 0 color: "#000" + readonly property var pages: sgMenu.getActivePages() + Component.onCompleted: { for (var i = 0; i < buttonGroup.buttons.length; ++i) { var b = buttonGroup.buttons[i]; @@ -43,12 +45,22 @@ Rectangle { buttonGroup.checkedButton = b; break; } - if (buttonGroup.checkedButton == null) { - buttonGroup.checkedButton = buttonGroup.buttons[0]; // check button #1 - } + //if (buttonGroup.checkedButton == null) { + // buttonGroup.checkedButton = buttonGroup.buttons[0]; // check button #1 + //} loadSettings(); } + Connections { + target: apx.fleet.current.mandala + function onTelemetryDecoded() { + if (pages.length <= 0) + return; + for (var i = 0; i < pages.length; ++i) + pages[i].updateChartsValues(); + } + } + function saveSettings() { var fjson = application.prefs.loadFile("charts.json"); var json = fjson ? JSON.parse(fjson) : {}; @@ -132,55 +144,84 @@ Rectangle { Layout.margins: Style.spacing spacing: 3 Layout.maximumHeight: 24 * ui.scale - SignalsButton { - text: "1" - checked: true - values: [] - } - SignalsButton { - text: "2" - values: [] - } - SignalsButton { - text: "3" - values: [] - } - SignalsButton { - text: "4" - values: [] - } - SignalsButton { - text: "5" - values: [] - } - SignalsButton { - text: "6" - values: [] - } - SignalsButton { - text: "7" - values: [] - } - SignalsButton { - text: "8" - values: [] - } - SignalsButton { - text: "9" - values: [] - } - SignalsButton { - text: "10" - values: [] - } + // SignalsButton { + // text: "1" + // checked: true + // values: [] + // } + // SignalsButton { + // text: "2" + // values: [] + // } + // SignalsButton { + // text: "3" + // values: [] + // } + // SignalsButton { + // text: "4" + // values: [] + // } + // SignalsButton { + // text: "5" + // values: [] + // } + // SignalsButton { + // text: "6" + // values: [] + // } + // SignalsButton { + // text: "7" + // values: [] + // } + // SignalsButton { + // text: "8" + // values: [] + // } + // SignalsButton { + // text: "9" + // values: [] + // } + // SignalsButton { + // text: "10" + // values: [] + // } + + Repeater { + id: btnRepeater + model: sgControl.pages + + // onItemAdded: function(index, item) { + // if (index === tabsRepeater.count - 1) + // Qt.callLater(control.selectSavedPage) + // } + + delegate: SignalsButton { + required property int index + required property var modelData + + property int pageIndex: index + + pageFact: modelData + values: pageFact.values + + //text: pageFact.title.slice(0, 3) + // checked: control.selectedPageFact + // ? pageFact === control.selectedPageFact + // : index === 0 + // values: control.pageFacts(index) + // pageToolTip: control.pageState(index).toolTip + // pageWarning: control.pageState(index).warning + // onEditTriggered: control.openPageEditor(pageFact) + } + } IconButton { iconName: "plus" toolTip: qsTr("Edit chart configuration") onClicked: sgMenu.trigger() - SignalsMenu { - id: sgMenu - } + // SignalsMenu { + // id: sgMenu + // } } TextButton { @@ -191,7 +232,6 @@ Rectangle { } } } - IconButton { anchors.top: parent.top anchors.right: parent.right @@ -206,6 +246,10 @@ Rectangle { } } + SignalsMenu { + id: sgMenu + } + property string currentPage: buttonGroup.checkedButton.text Settings { diff --git a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml index aae9fedde..6f7b8db63 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml @@ -29,17 +29,24 @@ import Apx.Common TextButton { id: sgBtn + property var pageFact: null property var values: [] Layout.fillHeight: true checkable: true ButtonGroup.group: buttonGroup + text: pageFact ? pageFact.title.slice(0, 3) : getDefaultText() textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor + toolTip: getToolTip() onCheckedChanged: if (checked) sgCharts.speedFactorValue = sgMenuPage.speed - onPressed: if (checked && !sgMenuPage.active) - sgMenuPage.trigger() + onPressed: { + if (!pageFact) + return; + if (checked && !pageFact.active) + pageFact.trigger(); + } onActivated: { sgCharts.resetEnable = true; sgCharts.facts = Qt.binding(function () { @@ -47,22 +54,20 @@ TextButton { }); } - Connections { - target: apx.fleet.current.mandala - function onTelemetryDecoded() { - // if (checked) // Comment it to calculate all values ​​at once - sgMenuPage.updateChartsValues(); - } + function getDefaultText() { + return "#" + buttonGroup.buttons.indexOf(this); } - function updateToolTip(facts) { + function getToolTip() { + if (!pageFact) + return "" + text + ""; var s = []; - s.push("" + sgMenuPage.title + ""); - for (var i = 0; i < facts.length; ++i) { - var fact = facts[i]; + s.push("" + pageFact.title + ""); + for (var i = 0; i < values.length; ++i) { + var fact = values[i]; s.push("" + fact.title + ""); } - toolTip = s.join("
"); + return s.join("
"); } function callQuickChart() { diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 221defef3..44d9cd6d6 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -63,19 +63,19 @@ Fact { // } function getCharts() { - var charts = [] + var charts = []; for (var i = 0; i < arguments.length; i++) { var fact = arguments[i]; - if(!fact) + if (!fact) continue; - if(!fact.opts) + if (!fact.opts) continue; - if(!fact.opts.color) + if (!fact.opts.color) continue; - var chart = { + var chart = { "bind": fact.mpath(), "color": fact.opts.color.toString() - } + }; charts.push(chart); } return charts; @@ -99,7 +99,7 @@ Fact { }, { "title": "Axy", - "charts":getCharts(mandala.est.acc.x, mandala.est.acc.y) + "charts": getCharts(mandala.est.acc.x, mandala.est.acc.y) }, { "title": "Az", @@ -132,12 +132,12 @@ Fact { } // function createDefaultSignals() { - // return { - // "active": { - // "signals": 0 - // }, - // "sets": [createDefaultSet()] - // }; + // return { + // "active": { + // "signals": 0 + // }, + // "sets": [createDefaultSet()] + // }; // } function loadSettings() { @@ -229,13 +229,37 @@ Fact { } function resetToDefaults() { - if(sgMenu.size <=0) + if (sgMenu.size <= 0) return; var defaultSet = sgMenu.child(0); defaultSet.data = createDefaultSet(); defaultSet.load(defaultSet.data); } + function getActiveSetIndex() { + for (var i = 0; i < sgMenu.size; ++i) { + if (sgMenu.child(i).active) + return i; + } + return sgMenu.size > 0 ? 0 : -1; + } + + function getActiveSet() { + var index = getActiveSetIndex(); + if (index < 0 || index >= sgMenu.size) + return null; + return sgMenu.child(index); + } + + function getActivePages() { + if (sgMenu.size <= 0) + return []; + var activeSet = getActiveSet(); + if (!activeSet) + return []; + return activeSet.getPages(); + } + Fact { title: qsTr("Add set") flags: Fact.Action diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 92239fe9d..edb25dbed 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -32,6 +32,7 @@ Fact { property bool changes: false property alias speed: mSpeed.value property var charts //from config + property var values: [] property var data: ({}) signal addTriggered @@ -49,13 +50,14 @@ Fact { } function updateBtnValues() { - // sgBtn.values = []; - // for (var i = 0; i < mCharts.size; ++i) - // sgBtn.values.push(mCharts.child(i)); + values = []; + for (var i = 0; i < mCharts.size; ++i) + values.push(mCharts.child(i)); // sgBtn.updateToolTip(sgBtn.values); } function updateChartsValues() { + console.log("update values for: ", title); for (var i = 0; i < mCharts.size; ++i) mCharts.child(i).updateValue(); } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 5c53c4164..ee5bbdb84 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -125,6 +125,17 @@ Fact { descr = descrList.length > 0 ? descrList.join(", ") : ""; } + function getPages() { + var pages = []; + for (var i = 0; i < mPages.size; ++i) { + var f = mPages.child(i); + if (!f) + continue; + pages.push(f); + } + return pages.length > 0 ? pages : []; + } + Fact { id: mSetName title: qsTr("Set name") @@ -177,8 +188,8 @@ Fact { visible: !newItem icon: "delete" onTriggered: { - if(setFact.num <= 0) { // don't delete default set - console.warn(qsTr("Can't delete default set")) + if (setFact.num <= 0) { // don't delete default set + console.warn(qsTr("Can't delete default set")); return; } removeTriggered(); From f1bdc9611f3ff45538b974027eb833f6006de381 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 28 Apr 2026 16:05:53 +0300 Subject: [PATCH 085/163] Select button corr.ection. --- src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index ee5bbdb84..53769cdd7 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -174,9 +174,9 @@ Fact { } Fact { flags: (Fact.Action | Fact.Apply) - title: qsTr("Select and save") + title: qsTr("Select") visible: !setFact.active - icon: "check-circle" + icon: "text-box-check" onTriggered: { setFact.selected(setFact.num); setFact.menuBack(); From 126b78d85f8a5e801cae67a77857883752fdb877 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 28 Apr 2026 16:38:59 +0300 Subject: [PATCH 086/163] SignalsButton toolTip refactores. --- .../Tools/FilteredCharts/SignalsButton.qml | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml index 6f7b8db63..b66b3129b 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml @@ -31,22 +31,26 @@ TextButton { property var pageFact: null property var values: [] + property string pageToolTip: "" + property bool pageWarning: false Layout.fillHeight: true checkable: true ButtonGroup.group: buttonGroup text: pageFact ? pageFact.title.slice(0, 3) : getDefaultText() textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor - toolTip: getToolTip() + toolTip: pageToolTip !== "" ? pageToolTip : getToolTip(values) onCheckedChanged: if (checked) sgCharts.speedFactorValue = sgMenuPage.speed + onPressed: { if (!pageFact) return; if (checked && !pageFact.active) pageFact.trigger(); } + onActivated: { sgCharts.resetEnable = true; sgCharts.facts = Qt.binding(function () { @@ -54,22 +58,25 @@ TextButton { }); } - function getDefaultText() { - return "#" + buttonGroup.buttons.indexOf(this); - } - - function getToolTip() { - if (!pageFact) - return "" + text + ""; + function getToolTip(facts) { var s = []; - s.push("" + pageFact.title + ""); - for (var i = 0; i < values.length; ++i) { - var fact = values[i]; - s.push("" + fact.title + ""); + s.push("" + text + ""); + for (var i = 0; i < facts.length; ++i) { + var fact = facts[i]; + var color = fact && fact.color ? fact.color : (fact && fact.opts ? fact.opts.color : undefined); + var label = fact && fact.title ? fact.title : (fact && fact.descr ? fact.descr : fact.bind); + if (color) + s.push("" + label + ""); + else + s.push(label); } return s.join("
"); } + function getDefaultText() { + return "#" + buttonGroup.buttons.indexOf(this); + } + function callQuickChart() { sgMenuPage.addNewChart(); } From 722fc9859f583ce2d1ecdb2b22bc03203719559c Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 28 Apr 2026 17:03:31 +0300 Subject: [PATCH 087/163] ToolTip color rect add. --- src/Plugins/Tools/FilteredCharts/SignalsButton.qml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml index b66b3129b..e6c62835f 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml @@ -63,10 +63,12 @@ TextButton { s.push("" + text + ""); for (var i = 0; i < facts.length; ++i) { var fact = facts[i]; - var color = fact && fact.color ? fact.color : (fact && fact.opts ? fact.opts.color : undefined); - var label = fact && fact.title ? fact.title : (fact && fact.descr ? fact.descr : fact.bind); + if(!fact) + continue; + var color = fact.color ? fact.color : (fact.opts ? fact.opts.color : undefined); + var label = fact.title ? fact.title : (fact.descr ? fact.descr : fact.bind); if (color) - s.push("" + label + ""); + s.push("\u25A0 " + label); else s.push(label); } From 7c1a6006cf7a8406c001c0b1f1b907c85fedc817 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 28 Apr 2026 17:26:49 +0300 Subject: [PATCH 088/163] Settings save updated. --- src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsMenu.qml | 1 + src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml | 3 +-- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml index 94a8ca466..6ab3e7206 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml @@ -111,6 +111,6 @@ Fact { title: qsTr("Save") enabled: !mChart.newItem && changes icon: "check-circle" - onTriggered: sgControl.saveSettings() + onTriggered: sgMenu.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml index 6059d8ac0..23fb0f727 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml @@ -97,6 +97,6 @@ Fact { title: qsTr("Save") enabled: !mChart.newItem && changes icon: "check-circle" - onTriggered: sgControl.saveSettings() + onTriggered: sgMenu.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 44d9cd6d6..badc8af65 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -198,6 +198,7 @@ Fact { application.prefs.saveFile("signals_2.json", JSON.stringify(json, ' ', 2)); // accepted(); // close(); + console.log("Signals settings saved") } function createFact(parent, url, opts) { diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index 4863e904d..3e804be16 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -306,7 +306,7 @@ Fact { title: qsTr("Save") enabled: !newItem && !mAdd.enabled && changes icon: "check-circle" - onTriggered: sgControl.saveSettings() + onTriggered: sgMenu.saveSettings() } Fact { flags: (Fact.Action | Fact.Remove) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml index 53bd9c641..1ca7dce41 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml @@ -42,6 +42,6 @@ Fact { title: qsTr("Save") enabled: !mChart.newItem && changes icon: "check-circle" - onTriggered: sgControl.saveSettings() + onTriggered: sgMenu.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml index 1be11da50..6e6f66d8a 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml @@ -112,6 +112,6 @@ Fact { title: qsTr("Save") enabled: !mChart.newItem && changes icon: "check-circle" - onTriggered: sgControl.saveSettings() + onTriggered: sgMenu.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index edb25dbed..9544a62f0 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -218,7 +218,7 @@ Fact { title: qsTr("Save") enabled: !newItem icon: "check-circle" - onTriggered: sgControl.saveSettings() + onTriggered: sgMenu.saveSettings() } Fact { flags: (Fact.Action | Fact.Remove) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 53769cdd7..0c274625b 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -169,8 +169,7 @@ Fact { title: qsTr("Save") visible: !newItem // && changes icon: "check-circle" - // onTriggered: console.log("Not implemented") - onTriggered: setFact.parent.saveSettings() + onTriggered: sgMenu.saveSettings() } Fact { flags: (Fact.Action | Fact.Apply) From 75baf2deabef5e406c68ab598524b3459e15e55e Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 28 Apr 2026 23:02:12 +0300 Subject: [PATCH 089/163] Chart menu title removed. --- .../Tools/FilteredCharts/SignalsMenuChart.qml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index 3e804be16..15726ee1d 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -48,7 +48,7 @@ Fact { load(data); updateTitle(); updateDescr(); - mTitle.valueChanged.connect(updateTitle); + mBind.valueChanged.connect(updateTitle); mBind.valueChanged.connect(updateDescr); mColor.valueChanged.connect(updateDescr); mFilters.valueChanged.connect(updateDescr); @@ -106,7 +106,8 @@ Fact { function updateTitle() { if (newItem) return; - title = mTitle.text ? mTitle.text : mBind.text; + if (mBind.text != "") + title = mBind.text; } function updateDescr() { @@ -123,8 +124,6 @@ Fact { continue; if (f.text === "") continue; - if (f.name === "color") - descrList.push(f.name.toUpperCase() + ": " + f.text.toUpperCase() + ""); else descrList.push(f.name.toUpperCase() + ": " + f.text); } @@ -230,14 +229,6 @@ Fact { value = state; } - Fact { - id: mTitle - name: "chartname" - title: qsTr("Title") - descr: qsTr("Chart name") - flags: Fact.Text - onTextChanged: changes = true - } Fact { id: mFact name: "binding" From b2ad5bebafb81a51729e1a98fa22228682f3d921 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 28 Apr 2026 23:29:15 +0300 Subject: [PATCH 090/163] Pinned tab added. --- .../Tools/FilteredCharts/FilteredCharts.qml | 49 ------------------- .../Tools/FilteredCharts/SignalsMenuPage.qml | 11 ++++- 2 files changed, 10 insertions(+), 50 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 1fa627a00..595418dbb 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -144,48 +144,6 @@ Rectangle { Layout.margins: Style.spacing spacing: 3 Layout.maximumHeight: 24 * ui.scale - // SignalsButton { - // text: "1" - // checked: true - // values: [] - // } - // SignalsButton { - // text: "2" - // values: [] - // } - // SignalsButton { - // text: "3" - // values: [] - // } - // SignalsButton { - // text: "4" - // values: [] - // } - // SignalsButton { - // text: "5" - // values: [] - // } - // SignalsButton { - // text: "6" - // values: [] - // } - // SignalsButton { - // text: "7" - // values: [] - // } - // SignalsButton { - // text: "8" - // values: [] - // } - // SignalsButton { - // text: "9" - // values: [] - // } - // SignalsButton { - // text: "10" - // values: [] - // } - Repeater { id: btnRepeater model: sgControl.pages @@ -249,11 +207,4 @@ Rectangle { SignalsMenu { id: sgMenu } - - property string currentPage: buttonGroup.checkedButton.text - - Settings { - category: "filteredCharts" - property alias page: sgControl.currentPage - } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 9544a62f0..b3f67ace6 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -73,6 +73,7 @@ Fact { } var page = {}; page.title = mPageName.value; + page.pinned = mPinned.value; page.speed = mSpeed.value; page.charts = tmpCharts; updateBtnValues(); @@ -82,7 +83,7 @@ Fact { function load(page) { mPageName.value = page.title; mSpeed.value = page.speed ? page.speed : 1; - charts = page.charts; + mPinned.value = charts = page.charts; updateSetItems(); changes = false; } @@ -161,6 +162,14 @@ Fact { icon: "rename-box" onTextChanged: updateTitle() } + Fact { + id: mPinned + title: qsTr("Pinned") + descr: qsTr("Pin this page to the signals layout") + flags: Fact.Bool + icon: "pin" + onValueChanged: console.log("Not implemented") + } Fact { id: mSpeed title: qsTr("Speed") From e0e87a0d6140fbdb5e607896d56a450c30878336 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 29 Apr 2026 04:24:42 +0300 Subject: [PATCH 091/163] Signals view and speed updated. --- .../Tools/FilteredCharts/FilteredCharts.qml | 157 +++++++++--------- .../Tools/FilteredCharts/SignalsButton.qml | 46 ++--- .../Tools/FilteredCharts/SignalsMenu.qml | 9 + .../Tools/FilteredCharts/SignalsMenuChart.qml | 2 +- .../Tools/FilteredCharts/SignalsMenuPage.qml | 12 +- .../Tools/FilteredCharts/SignalsMenuSet.qml | 11 ++ src/Plugins/Tools/Signals/SignalsView.qml | 1 - 7 files changed, 132 insertions(+), 106 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 595418dbb..592f6a60e 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -36,6 +36,8 @@ Rectangle { color: "#000" readonly property var pages: sgMenu.getActivePages() + readonly property var activeSet: sgMenu.getActiveSet() + readonly property var activePage: sgMenu.getActivePage() Component.onCompleted: { for (var i = 0; i < buttonGroup.buttons.length; ++i) { @@ -48,7 +50,6 @@ Rectangle { //if (buttonGroup.checkedButton == null) { // buttonGroup.checkedButton = buttonGroup.buttons[0]; // check button #1 //} - loadSettings(); } Connections { @@ -61,44 +62,6 @@ Rectangle { } } - function saveSettings() { - var fjson = application.prefs.loadFile("charts.json"); - var json = fjson ? JSON.parse(fjson) : {}; - json.sets = []; - for (var i = 0; i < buttonGroup.buttons.length; ++i) { - var b = buttonGroup.buttons[i]; - var set = buttonGroup.buttons[i].getSet(); - if (!set) - continue; - json.sets.push(set); - } - application.prefs.saveFile("charts.json", JSON.stringify(json, ' ', 2)); - } - - function loadSettings() { - var sets = []; - var fjson = application.prefs.loadFile("charts.json"); - var json = fjson ? JSON.parse(fjson) : {}; - var set = {}; - if (json && json.sets) { - for (var i in json.sets) { - set = json.sets[i]; - if (!(typeof set === 'object' && !Array.isArray(set) && set !== null)) - continue; - sets.push(set); - } - } - if (sets.length <= 0) { - return; - } - // Create charts - for (var i in sets) { - if (i < buttonGroup.buttons.length) { - buttonGroup.buttons[i].loadSet(sets[i]); - } - } - } - function checkScrMatches(val) { var matches = false; for (var i = 0; i < buttonGroup.buttons.length; ++i) @@ -108,15 +71,18 @@ Rectangle { } function changeSpeed() { - if (sgCharts.speedFactorValue !== sgCharts.speedFactor[sgCharts.speedFactor.length - 1]) { - for (var i = 0; i < sgCharts.speedFactor.length - 1; ++i) { - if (sgCharts.speedFactor[i] <= sgCharts.speedFactorValue && sgCharts.speedFactorValue < sgCharts.speedFactor[i + 1]) { - buttonGroup.checkedButton.setSpeed(sgCharts.speedFactor[i + 1]); + if(!activePage) + return; + var newSpeed = 1; + if (sgMainChart.speedFactorValue !== sgMainChart.speedFactor[sgMainChart.speedFactor.length - 1]) { + for (var i = 0; i < sgMainChart.speedFactor.length - 1; ++i) { + if (sgMainChart.speedFactor[i] <= sgMainChart.speedFactorValue && sgMainChart.speedFactorValue < sgMainChart.speedFactor[i + 1]) { + activePage.speed = sgMainChart.speedFactor[i + 1] break; } } } else { - buttonGroup.checkedButton.setSpeed(sgCharts.speedFactor[0]); + activePage.speed = sgMainChart.speedFactor[0]; } } @@ -125,13 +91,82 @@ Rectangle { anchors.fill: parent spacing: 0 - SignalsChartView { - id: sgCharts - facts: [] + Item { + id: mainChartArea Layout.fillWidth: true Layout.fillHeight: true Layout.minimumHeight: 20 Layout.preferredHeight: 130 * ui.scale + clip: true + + SignalsChartView { + id: sgMainChart + anchors.fill: parent + facts: [] + } + Rectangle { + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: 4 * ui.scale + radius: 2 * ui.scale + visible: lblMainPage.text !== "" + implicitWidth: columnMainPage.implicitWidth + 10 * ui.scale + implicitHeight: columnMainPage.implicitHeight + 4 * ui.scale + color: mouseArea.containsMouse ? "#40ffffff" : "#20ffffff" + opacity: 0.7 + + Column { + id: columnMainPage + anchors.centerIn: parent + spacing: 1 * ui.scale + + Label { + id: lblMainPage + anchors.horizontalCenter: parent.horizontalCenter + text: sgControl.activePage ? sgControl.activePage.title : "" + // font: 14 * ui.scale + } + Label { + id: lblMainSpeed + anchors.right: parent.right + text: sgMainChart.speedFactorValue + "x" + } + } + MouseArea { + id: mouseArea + anchors.fill: parent + acceptedButtons: Qt.LeftButton + hoverEnabled: true + onClicked: changeSpeed() + } + } + + Rectangle { + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.rightMargin: 4 * ui.scale + visible: lblMainSet.text !== "" + radius: ui.scale + color: "#30ffffff" + opacity: 0.7 + + implicitWidth: lblMainSet.implicitWidth + 10 * ui.scale + implicitHeight: lblMainSet.implicitHeight + 4 * ui.scale + + Label { + id: lblMainSet + anchors.centerIn: parent + text: sgControl.activeSet ? sgControl.activeSet.title : "" + // font: control.overlayFont(14 * control.uiScale) + } + } + + Label { + anchors.centerIn: parent + visible: btnRepeater.count <= 0 + text: qsTr("No pages in the active set.") + color: Material.secondaryTextColor + } } ButtonGroup { @@ -148,11 +183,6 @@ Rectangle { id: btnRepeater model: sgControl.pages - // onItemAdded: function(index, item) { - // if (index === tabsRepeater.count - 1) - // Qt.callLater(control.selectSavedPage) - // } - delegate: SignalsButton { required property int index required property var modelData @@ -162,12 +192,9 @@ Rectangle { pageFact: modelData values: pageFact.values - //text: pageFact.title.slice(0, 3) - // checked: control.selectedPageFact // ? pageFact === control.selectedPageFact // : index === 0 - // values: control.pageFacts(index) // pageToolTip: control.pageState(index).toolTip // pageWarning: control.pageState(index).warning // onEditTriggered: control.openPageEditor(pageFact) @@ -181,26 +208,6 @@ Rectangle { // id: sgMenu // } } - - TextButton { - text: sgCharts.speedFactorValue + "x" - Layout.fillHeight: true - Layout.minimumWidth: height * 4 - onClicked: changeSpeed() - } - } - } - IconButton { - anchors.top: parent.top - anchors.right: parent.right - anchors.margins: Style.spacing - size: Style.buttonSize * 0.7 - iconName: "plus" - toolTip: qsTr("Edit charts") - opacity: ui.effects ? (hovered ? 1 : 0.5) : 1 - onTriggered: { - var activeButton = buttonGroup.checkedButton; - activeButton.callQuickChart(); } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml index e6c62835f..bfcd49495 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml @@ -33,6 +33,7 @@ TextButton { property var values: [] property string pageToolTip: "" property bool pageWarning: false + property var speed: pageFact ? pageFact.speed : 1 Layout.fillHeight: true checkable: true @@ -41,19 +42,32 @@ TextButton { textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor toolTip: pageToolTip !== "" ? pageToolTip : getToolTip(values) - onCheckedChanged: if (checked) - sgCharts.speedFactorValue = sgMenuPage.speed + onCheckedChanged: { + if (!pageFact) + return; + if (checked) + sgMainChart.speedFactorValue = pageFact.speed; + pageFact.active = checked; + } onPressed: { if (!pageFact) return; - if (checked && !pageFact.active) + if (checked) pageFact.trigger(); + else + sgMainChart.speedFactorValue = speed; + } + onSpeedChanged: { + if (!pageFact) + return; + if (pageFact.active) + sgMainChart.speedFactorValue = speed; } onActivated: { - sgCharts.resetEnable = true; - sgCharts.facts = Qt.binding(function () { + sgMainChart.resetEnable = true; + sgMainChart.facts = Qt.binding(function () { return values; }); } @@ -63,7 +77,7 @@ TextButton { s.push("" + text + ""); for (var i = 0; i < facts.length; ++i) { var fact = facts[i]; - if(!fact) + if (!fact) continue; var color = fact.color ? fact.color : (fact.opts ? fact.opts.color : undefined); var label = fact.title ? fact.title : (fact.descr ? fact.descr : fact.bind); @@ -94,24 +108,14 @@ TextButton { function getScrMatches(val) { return sgMenuPage.checkScrs(val); } - - function setSpeed(val) { - sgMenuPage.speed = val; - saveTimer.restart(); // save settings after speed changed - } - - Timer { - id: timer - interval: 10000 - } + // Timer { + // id: timer + // interval: 10000 + // } Timer { id: saveTimer interval: 1000 - onTriggered: sgControl.saveSettings() - } - - SignalsMenuPage { - id: sgMenuPage + onTriggered: sgMenu.saveSettings() } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index badc8af65..8c6c6d99a 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -261,6 +261,15 @@ Fact { return activeSet.getPages(); } + function getActivePage() { + if (sgMenu.size <= 0) + return null; + var activeSet = getActiveSet(); + if (!activeSet) + return null; + return activeSet.getActivePage(); + } + Fact { title: qsTr("Add set") flags: Fact.Action diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index 15726ee1d..465f0eceb 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -141,7 +141,7 @@ Fact { mChart.opts = opt; mColor.changes = false; pageFact.updateBtnValues(); - sgCharts.updateSeriesColor(); + sgMainChart.updateSeriesColor(); } function updateValue() { diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index b3f67ace6..d5bd7c403 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -57,7 +57,6 @@ Fact { } function updateChartsValues() { - console.log("update values for: ", title); for (var i = 0; i < mCharts.size; ++i) mCharts.child(i).updateValue(); } @@ -181,13 +180,10 @@ Fact { min: 0.2 max: 4 onValueChanged: { - // New functionality + if (active && setFact.active) + sgMainChart.speedFactorValue = value; updateDescr(); - // ================= - if (!sgBtn || !sgBtn.checked) - return; - sgCharts.speedFactorValue = value; - changes = true; + // changes = true; } } SignalsMenuChart { @@ -206,7 +202,7 @@ Fact { // New functionality updateDescr(); // ================= - sgCharts.resetEnable = true; + sgMainChart.resetEnable = true; } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 0c274625b..df770705f 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -136,6 +136,17 @@ Fact { return pages.length > 0 ? pages : []; } + function getActivePage() { + for (var i = 0; i < mPages.size; ++i) { + var f = mPages.child(i); + if (!f) + continue; + if(f.active) + return f; + } + return null; + } + Fact { id: mSetName title: qsTr("Set name") diff --git a/src/Plugins/Tools/Signals/SignalsView.qml b/src/Plugins/Tools/Signals/SignalsView.qml index ced0458b9..22b938b33 100644 --- a/src/Plugins/Tools/Signals/SignalsView.qml +++ b/src/Plugins/Tools/Signals/SignalsView.qml @@ -216,6 +216,5 @@ Item { speed++; else speed = 0; - //console.log(speed) } } From 4f3ddbb735c187e1fbdeb0bbe1b3b649e7fe335b Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 29 Apr 2026 15:11:03 +0300 Subject: [PATCH 092/163] Fix charts scale. --- src/Plugins/Tools/FilteredCharts/FilteredCharts.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 592f6a60e..99a2546dd 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -31,7 +31,7 @@ Rectangle { id: sgControl implicitHeight: layout.implicitHeight - implicitWidth: layout.implicitWidth + implicitWidth: Style.buttonSize * 15 border.width: 0 color: "#000" @@ -71,13 +71,13 @@ Rectangle { } function changeSpeed() { - if(!activePage) + if (!activePage) return; var newSpeed = 1; if (sgMainChart.speedFactorValue !== sgMainChart.speedFactor[sgMainChart.speedFactor.length - 1]) { for (var i = 0; i < sgMainChart.speedFactor.length - 1; ++i) { if (sgMainChart.speedFactor[i] <= sgMainChart.speedFactorValue && sgMainChart.speedFactorValue < sgMainChart.speedFactor[i + 1]) { - activePage.speed = sgMainChart.speedFactor[i + 1] + activePage.speed = sgMainChart.speedFactor[i + 1]; break; } } From 1442e696e2d87a7f4334d145a5652c06cd24f2e9 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 30 Apr 2026 02:47:07 +0300 Subject: [PATCH 093/163] Filters template created. --- .../FilteredCharts/SignalsFilterChooser.qml | 71 +++++++++++++++++ .../SignalsFilterKalmanSimple.qml | 17 +++- .../SignalsFilterRunningAvg.qml | 18 ++++- .../FilteredCharts/SignalsMenuFilters.qml | 79 +++++++++++++------ 4 files changed, 157 insertions(+), 28 deletions(-) create mode 100644 src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml new file mode 100644 index 000000000..6eafb7b99 --- /dev/null +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml @@ -0,0 +1,71 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick + +import APX.Facts + +Fact { + id: filterChooser + + function addSelected() { + console.log("size:", filterChooser.size) + for(var i = 0; i < filterChooser.size; ++i) { + var fact = filterChooser.child(i) + if(fact && fact.value) + fMenu.createFilter(fact.name) + } + } + + Fact { + id: chrRunningAvg + name: "running_avg" + title: qsTr("Running average") + descr: qsTr("Select running average filter") + flags: Fact.Bool + onTriggered: { + fMenu.createFilter(name); + filterChooser.menuBack() + } + } + Fact { + id: chrKalmanSimple + name: "kalman_smp" + title: qsTr("Kalman simple") + descr: qsTr("Select simple kalman filter") + flags: Fact.Bool + onTriggered: { + fMenu.createFilter(name) + filterChooser.menuBack() + } + } + + // Actions + Fact { + flags: (Fact.Action | Fact.Apply) + title: qsTr("Add selected") + icon: "check-circle" + onTriggered: { + addSelected() + filterChooser.menuBack() + } + } +} diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml index 6ab3e7206..5c748538e 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml @@ -26,7 +26,11 @@ import APX.Facts Fact { id: ksFilter - flags: Fact.Group + title: qsTr("Kalman simple") + descr: qsTr("Simple kalman filter settings") + icon: "tune" + + flags: (Fact.Group | Fact.Bool) property bool changes: false property var coefs: [1,1] @@ -109,8 +113,17 @@ Fact { Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - enabled: !mChart.newItem && changes + // enabled: !mChart.newItem && changes icon: "check-circle" onTriggered: sgMenu.saveSettings() } + Fact { + flags: (Fact.Action | Fact.Remove) + title: qsTr("Remove") + icon: "delete" + onTriggered: { + removeTriggered(); + ksFilter.deleteFact(); + } + } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml index 23fb0f727..e11252ad0 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml @@ -25,8 +25,11 @@ import APX.Facts Fact { id: raFilter - - flags: Fact.Group + title: qsTr("Running average") + descr: qsTr("Running average filter settings") + icon: "tune" + + flags: (Fact.Group | Fact.Bool) property bool changes: false property var data: ({}) @@ -95,8 +98,17 @@ Fact { Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - enabled: !mChart.newItem && changes + // enabled: !mChart.newItem && changes icon: "check-circle" onTriggered: sgMenu.saveSettings() } + Fact { + flags: (Fact.Action | Fact.Remove) + title: qsTr("Remove") + icon: "delete" + onTriggered: { + removeTriggered(); + raFilter.deleteFact(); + } + } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml index 6e6f66d8a..eb5a2dc63 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml @@ -26,6 +26,10 @@ import APX.Facts Fact { id: fMenu + title: qsTr("Kalman simple") + descr: qsTr("Simple kalman filter settings") + flags: (Fact.Group | Fact.FlatModel) + property bool changes: false property var data: ({}) @@ -68,12 +72,39 @@ Fact { if (typeof value === 'object' && !Array.isArray(value) && value !== null) { data = value; load(); - fRunningAvg.fillData(); - fKalmanSimple.fillData(); + // fRunningAvg.fillData(); + // fKalmanSimple.fillData(); changes = false; } } + // Filters creation + function createFilter(filterName) { + console.log("Create filter:", filterName); + switch (filterName) { + case "running_avg": + createRunningAvg(); + break; + case "kalman_smp": + createKalmanSimple() + break; + default: + console.warn(qsTr("Wrong filter type. Filter creation failed")) + } + } + + function createRunningAvg(filterData) { + var c = createFact(fFilters, "SignalsFilterRunningAvg.qml", { + "data": filterData + }); + } + + function createKalmanSimple(filterData) { + var c = createFact(fFilters, "SignalsFilterKalmanSimple.qml", { + "data": filterData + }); + } + // Getting filter data function getRunningAvgCoef() { return fRunningAvg.coef; @@ -83,34 +114,36 @@ Fact { return fKalmanSimple.coefs } - Fact { - id: fTypes - name: "filters" - title: qsTr("Filter") - descr: qsTr("Selecting the filter to use") - flags: Fact.Enum - enumStrings: ["none", "running_avg", "kalman_smp"] - onTextChanged: fMenu.value = text - onValueChanged: changes = true // combobox index changed - } - SignalsFilterRunningAvg { - id: fRunningAvg - name: "running_avg" - title: qsTr("Running average") - descr: qsTr("Running average filter settings") + SignalsFilterChooser { + title: qsTr("Add new filter") + descr: qsTr("Selecting and adding filters") + icon: "plus-circle" } - SignalsFilterKalmanSimple { - id: fKalmanSimple - name: "kalman_smp" - title: qsTr("Kalman simple") - descr: qsTr("Simple kalman filter settings") + + Fact { + id: fFilters + title: qsTr("Filters") + flags: (Fact.Group | Fact.Section | Fact.DragChildren) } + // SignalsFilterRunningAvg { + // id: fRunningAvg + // name: "running_avg" + // title: qsTr("Running average") + // descr: qsTr("Running average filter settings") + // } + // SignalsFilterKalmanSimple { + // id: fKalmanSimple + // name: "kalman_smp" + // title: qsTr("Kalman simple") + // descr: qsTr("Simple kalman filter settings") + // } + // Actions Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - enabled: !mChart.newItem && changes + // enabled: !mChart.newItem && changes icon: "check-circle" onTriggered: sgMenu.saveSettings() } From e0c1a5075f7f715a2038e450fa42ffc69fcb76f0 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 30 Apr 2026 13:26:17 +0300 Subject: [PATCH 094/163] Filter saving and loading added. --- .../FilteredCharts/SignalsFilterChooser.qml | 6 +- .../SignalsFilterKalmanSimple.qml | 27 ++++---- .../SignalsFilterRunningAvg.qml | 26 ++++---- .../Tools/FilteredCharts/SignalsMenuChart.qml | 2 +- .../FilteredCharts/SignalsMenuFilters.qml | 63 ++++++++----------- 5 files changed, 56 insertions(+), 68 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml index 6eafb7b99..e1cac8a89 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml @@ -31,7 +31,7 @@ Fact { for(var i = 0; i < filterChooser.size; ++i) { var fact = filterChooser.child(i) if(fact && fact.value) - fMenu.createFilter(fact.name) + fMenu.createFilter({"type": fact.name}) } } @@ -42,7 +42,7 @@ Fact { descr: qsTr("Select running average filter") flags: Fact.Bool onTriggered: { - fMenu.createFilter(name); + fMenu.createFilter({"type": name}); filterChooser.menuBack() } } @@ -53,7 +53,7 @@ Fact { descr: qsTr("Select simple kalman filter") flags: Fact.Bool onTriggered: { - fMenu.createFilter(name) + fMenu.createFilter({"type": name}); filterChooser.menuBack() } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml index 5c748538e..fde29ef3f 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml @@ -25,20 +25,21 @@ import APX.Facts Fact { id: ksFilter - title: qsTr("Kalman simple") descr: qsTr("Simple kalman filter settings") icon: "tune" - flags: (Fact.Group | Fact.Bool) + property var filterType: "kalman_smp" property bool changes: false property var coefs: [1,1] property var data: ({}) - onChangesChanged: { if (changes) fMenu.changes = true;} + Component.onCompleted: load(data) + // onChangesChanged: { if (changes) fMenu.changes = true;} - function load() { + function load(data) { + console.log("load kalman: ", JSON.stringify(data)) for (var i = 0; i < size; ++i) { var f = child(i); var v = data[settingName(f)]; @@ -49,6 +50,8 @@ Fact { function save() { data = {}; + data.type = filterType; + data.value = value; for (var i = 0; i < size; ++i) { var f = child(i); var s = f.text.trim(); @@ -57,6 +60,7 @@ Fact { data[settingName(f)] = s; } updateCoefs(); + console.log("save ", title) return data; } @@ -67,15 +71,8 @@ Fact { return n; } - function fillData() { - if (typeof value === 'object' && !Array.isArray(value) && value !== null) { - data = value; - load(); - } - } - - function updateFilterValue() { - ksFilter.value = "Km=" + ksMeasNoise.value + ",Ke=" + ksEnvNoise.value; + function updateDescr() { + descr = qsTr("COEF") + ": " + "Km=" + ksMeasNoise.value + ", Ke=" + ksEnvNoise.value; changes = true; } @@ -94,7 +91,7 @@ Fact { min: 0 max: 10000 precision: 3 - onValueChanged: updateFilterValue() + onValueChanged: updateDescr() } Fact { id: ksEnvNoise @@ -106,7 +103,7 @@ Fact { min: 0 max: 10000 precision: 3 - onValueChanged: updateFilterValue() + onValueChanged: updateDescr() } // Actions diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml index e11252ad0..ac082ebd4 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml @@ -28,16 +28,18 @@ Fact { title: qsTr("Running average") descr: qsTr("Running average filter settings") icon: "tune" - flags: (Fact.Group | Fact.Bool) + property var filterType: "running_avg" property bool changes: false property var data: ({}) property var coef: 1 - onChangesChanged: { if (changes) fMenu.changes = true;} + Component.onCompleted: load(data) + // onChangesChanged: { if (changes) fMenu.changes = true;} - function load() { + function load(data) { + console.log("load running: ", JSON.stringify(data)) for (var i = 0; i < size; ++i) { var f = child(i); var v = data[settingName(f)]; @@ -48,6 +50,8 @@ Fact { function save() { data = {}; + data.type = filterType; + data.value = value; for (var i = 0; i < size; ++i) { var f = child(i); var s = f.text.trim(); @@ -56,6 +60,7 @@ Fact { data[settingName(f)] = s; } updateCoef(); + console.log("save ", title) return data; } @@ -65,12 +70,10 @@ Fact { return n.slice(0, n.indexOf("_")); return n; } - - function fillData() { - if (typeof value === 'object' && !Array.isArray(value) && value !== null) { - data = value; - load(); - } + + function updateDescr() { + descr = qsTr("COEF") + ": K=" + raCoef.value + changes = true; } function updateCoef() { @@ -88,10 +91,7 @@ Fact { min: 0 max: 1 precision: 3 - onValueChanged: { - raFilter.value = "K=" + value; - changes = true; - } + onValueChanged: updateDescr() } // Actions diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index 465f0eceb..c06011ba3 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -63,7 +63,7 @@ Fact { var v = data[settingName(f)]; f.value = v; } - mFilters.fillData(); + // mFilters.fillData(); updateChartVars(); } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml index eb5a2dc63..4e10ffbf8 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml @@ -26,8 +26,6 @@ import APX.Facts Fact { id: fMenu - title: qsTr("Kalman simple") - descr: qsTr("Simple kalman filter settings") flags: (Fact.Group | Fact.FlatModel) property bool changes: false @@ -35,30 +33,32 @@ Fact { signal removeTriggered + Component.onCompleted: load(value) onChangesChanged: { if (changes) mChart.changes = true;} - function load() { - for (var i = 0; i < size; ++i) { - var f = child(i); - var v = data[settingName(f)]; - f.value = v; + function load(value) { + if(!value) + return; + var filters = value.filters + if (filters === undefined || filters.length === 0) + return; + fSet.deleteChildren(); + for (var i in filters) { + createFilter(filters[i]); } + updateBtnValues(); changes = false; } function save() { - data = {}; - for (var i = 0; i < size; ++i) { - var f = child(i); - var s = f.text.trim(); - if (f.size != 0) - s = f.save(); - if (s === "") - continue; - data[settingName(f)] = s; + var tmpFilters = []; + for (var i = 0; i < fSet.size; ++i) { + var mfilter = fSet.child(i).save(); + tmpFilters.push(mfilter); } - changes = false; - return data; + var fmenu = {}; + fmenu.filters = tmpFilters; + return fmenu; } function settingName(f) { @@ -68,25 +68,16 @@ Fact { return n; } - function fillData() { - if (typeof value === 'object' && !Array.isArray(value) && value !== null) { - data = value; - load(); - // fRunningAvg.fillData(); - // fKalmanSimple.fillData(); - changes = false; - } - } - // Filters creation - function createFilter(filterName) { - console.log("Create filter:", filterName); - switch (filterName) { + function createFilter(filterData) { + var type = filterData.type; + console.log("Create filter:", type, JSON.stringify(filterData)); + switch (type) { case "running_avg": - createRunningAvg(); + createRunningAvg(filterData); break; case "kalman_smp": - createKalmanSimple() + createKalmanSimple(filterData) break; default: console.warn(qsTr("Wrong filter type. Filter creation failed")) @@ -94,13 +85,13 @@ Fact { } function createRunningAvg(filterData) { - var c = createFact(fFilters, "SignalsFilterRunningAvg.qml", { + var c = createFact(fSet, "SignalsFilterRunningAvg.qml", { "data": filterData }); } function createKalmanSimple(filterData) { - var c = createFact(fFilters, "SignalsFilterKalmanSimple.qml", { + var c = createFact(fSet, "SignalsFilterKalmanSimple.qml", { "data": filterData }); } @@ -121,7 +112,7 @@ Fact { } Fact { - id: fFilters + id: fSet title: qsTr("Filters") flags: (Fact.Group | Fact.Section | Fact.DragChildren) } From 4b94fb2263fb2569981f771122deb959f46ee2b4 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 30 Apr 2026 14:03:48 +0300 Subject: [PATCH 095/163] New filter cteation defaults value fix. --- .../Tools/FilteredCharts/SignalsFilterKalmanSimple.qml | 5 ++++- src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml index fde29ef3f..9534692a3 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml @@ -40,11 +40,14 @@ Fact { function load(data) { console.log("load kalman: ", JSON.stringify(data)) + value = data.value !== undefined ? data.value : 0 for (var i = 0; i < size; ++i) { var f = child(i); var v = data[settingName(f)]; - f.value = v; + if(v !== undefined) + f.value = v; } + updateDescr() updateCoefs(); } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml index ac082ebd4..63affac96 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml @@ -40,11 +40,14 @@ Fact { function load(data) { console.log("load running: ", JSON.stringify(data)) + value = data.value !== undefined ? data.value : 0 for (var i = 0; i < size; ++i) { var f = child(i); var v = data[settingName(f)]; - f.value = v; + if(v !== undefined) + f.value = v; } + updateDescr(); updateCoef(); } From 77ee886fa8fd8765a548d131f8304b0ae90f3ad4 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 30 Apr 2026 16:33:04 +0300 Subject: [PATCH 096/163] Using filters implementation. --- .../FilteredCharts/SignalsFilterChooser.qml | 1 - .../SignalsFilterKalmanSimple.qml | 31 +++++++++++-- .../SignalsFilterRunningAvg.qml | 8 +++- .../Tools/FilteredCharts/SignalsMenuChart.qml | 45 ++----------------- .../FilteredCharts/SignalsMenuFilters.qml | 31 +++++-------- 5 files changed, 48 insertions(+), 68 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml index e1cac8a89..a58a3afe0 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterChooser.qml @@ -27,7 +27,6 @@ Fact { id: filterChooser function addSelected() { - console.log("size:", filterChooser.size) for(var i = 0; i < filterChooser.size; ++i) { var fact = filterChooser.child(i) if(fact && fact.value) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml index 9534692a3..dcc586537 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml @@ -32,14 +32,14 @@ Fact { property var filterType: "kalman_smp" property bool changes: false - property var coefs: [1,1] + property var measCoef: 1 + property var envCoef: 1 property var data: ({}) Component.onCompleted: load(data) // onChangesChanged: { if (changes) fMenu.changes = true;} function load(data) { - console.log("load kalman: ", JSON.stringify(data)) value = data.value !== undefined ? data.value : 0 for (var i = 0; i < size; ++i) { var f = child(i); @@ -63,7 +63,6 @@ Fact { data[settingName(f)] = s; } updateCoefs(); - console.log("save ", title) return data; } @@ -80,10 +79,34 @@ Fact { } function updateCoefs() { - coefs = [ksMeasNoise.value, ksEnvNoise.value] + measCoef = ksMeasNoise.value; + envCoef = ksEnvNoise.value; + // coefs = [ksMeasNoise.value, ksEnvNoise.value] changes = false; } + // Use Kalman Simple filter + property var state: 0 + property var covariance: 0.1 + + function setKalmanState(st, cv) { + state = st; + covariance = cv; + } + + function processValue(value, v) { + // Time update - prediction + var x0 = state; + var p0 = covariance + measCoef; + + // Measurement update - correction + var k = p0 / (p0 + envCoef); + state = x0 + k * (v - x0); + covariance = (1 - k) * p0; + value = state; + return value; + } + Fact { id: ksMeasNoise name: "measurement_noise" diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml index 63affac96..cad3e7b08 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml @@ -39,7 +39,6 @@ Fact { // onChangesChanged: { if (changes) fMenu.changes = true;} function load(data) { - console.log("load running: ", JSON.stringify(data)) value = data.value !== undefined ? data.value : 0 for (var i = 0; i < size; ++i) { var f = child(i); @@ -63,7 +62,6 @@ Fact { data[settingName(f)] = s; } updateCoef(); - console.log("save ", title) return data; } @@ -84,6 +82,12 @@ Fact { changes = false; } + // Use Running Average filter + function processValue(value, v) { + value += (v - value) * coef; + return value; + } + Fact { id: raCoef name: "coefficient" diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index c06011ba3..d00bd4d72 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -97,7 +97,7 @@ Fact { scr = mFact2Save.text; if (type === "kalman_smp") { var v = value !== undefined ? value : 0; - setKalmanState(v, 0.1); // set start state and covariance + mFilters.setKalmanSimpleState(v, 0.1); // set start state and covariance } changes = false; setColor(); @@ -151,21 +151,12 @@ Fact { throw new Error(qsTr("expression is undefined")); // For first init if (value === undefined) { - setKalmanState(v, 0.1); + mFilters.setKalmanSimpleState(v, 0.1); value = v; return; } // Use filters - switch (type) { - case "running_avg": - useRunningAvgFilter(v); - break; - case "kalman_smp": - useKalmanSmpFilter(v); - break; - default: - value = v; - } + value = mFilters.useFilters(value, v) } catch (e) { chartWarning(e.message); } @@ -199,36 +190,6 @@ Fact { return true; } - // Filters functions - // Running average filter - function useRunningAvgFilter(v) { - var k = mFilters.getRunningAvgCoef(); - value += (v - value) * k; - } - - // Kalman simple filter - property var state: 0 - property var covariance: 0.1 - - function setKalmanState(st, cv) { - state = st; - covariance = cv; - } - - function useKalmanSmpFilter(v) { - var coefs = mFilters.getKalmanSimpleCoefs(); - - // Time update - prediction - var x0 = state; - var p0 = covariance + coefs[0]; - - // Measurement update - correction - var k = p0 / (p0 + coefs[1]); - state = x0 + k * (v - x0); - covariance = (1 - k) * p0; - value = state; - } - Fact { id: mFact name: "binding" diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml index 4e10ffbf8..6c933e842 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml @@ -71,7 +71,6 @@ Fact { // Filters creation function createFilter(filterData) { var type = filterData.type; - console.log("Create filter:", type, JSON.stringify(filterData)); switch (type) { case "running_avg": createRunningAvg(filterData); @@ -96,13 +95,20 @@ Fact { }); } - // Getting filter data - function getRunningAvgCoef() { - return fRunningAvg.coef; + // Using filters + function useFilters(value, v) { + for(var i = 0; i < fSet.size; ++i) { + if(!fSet.child(i).value) + continue; + v = fSet.child(i).processValue(value, v) + } + return v; } - function getKalmanSimpleCoefs() { - return fKalmanSimple.coefs + function setKalmanSimpleState(st, cv) { + for(var i = 0; i < fSet.size; ++i) + if(fSet.child(i).filterType === "kalman_smp") + fSet.child(i).setKalmanState(st, cv); } SignalsFilterChooser { @@ -117,19 +123,6 @@ Fact { flags: (Fact.Group | Fact.Section | Fact.DragChildren) } - // SignalsFilterRunningAvg { - // id: fRunningAvg - // name: "running_avg" - // title: qsTr("Running average") - // descr: qsTr("Running average filter settings") - // } - // SignalsFilterKalmanSimple { - // id: fKalmanSimple - // name: "kalman_smp" - // title: qsTr("Kalman simple") - // descr: qsTr("Simple kalman filter settings") - // } - // Actions Fact { flags: (Fact.Action | Fact.Apply) From 9654ad0327be56f05d125e4271f2c61e3ebb6d6d Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 30 Apr 2026 17:10:51 +0300 Subject: [PATCH 097/163] ChartView font style changed. --- src/Plugins/Tools/FilteredCharts/FilteredCharts.qml | 10 +++++----- src/Plugins/Tools/FilteredCharts/SignalsChartView.qml | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 99a2546dd..7d2d1cbbf 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -112,24 +112,23 @@ Rectangle { visible: lblMainPage.text !== "" implicitWidth: columnMainPage.implicitWidth + 10 * ui.scale implicitHeight: columnMainPage.implicitHeight + 4 * ui.scale - color: mouseArea.containsMouse ? "#40ffffff" : "#20ffffff" + color: mouseArea.containsMouse ? "#50ffffff" : "#30ffffff" opacity: 0.7 Column { id: columnMainPage anchors.centerIn: parent - spacing: 1 * ui.scale - Label { id: lblMainPage anchors.horizontalCenter: parent.horizontalCenter text: sgControl.activePage ? sgControl.activePage.title : "" - // font: 14 * ui.scale + font: apx.font_narrow(Style.fontSize * 0.8) } Label { id: lblMainSpeed anchors.right: parent.right text: sgMainChart.speedFactorValue + "x" + font: apx.font_narrow(Style.fontSize * 0.8) } } MouseArea { @@ -157,7 +156,7 @@ Rectangle { id: lblMainSet anchors.centerIn: parent text: sgControl.activeSet ? sgControl.activeSet.title : "" - // font: control.overlayFont(14 * control.uiScale) + font: apx.font_narrow(Style.fontSize * 0.8) } } @@ -165,6 +164,7 @@ Rectangle { anchors.centerIn: parent visible: btnRepeater.count <= 0 text: qsTr("No pages in the active set.") + font: apx.font_narrow(Style.fontSize * 0.8) color: Material.secondaryTextColor } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsChartView.qml b/src/Plugins/Tools/FilteredCharts/SignalsChartView.qml index 4f590f947..2b2f7f872 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsChartView.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsChartView.qml @@ -24,6 +24,8 @@ import QtCharts import QtQuick.Controls import QtQml +import Apx.Common + Item { id: chartItem @@ -113,7 +115,7 @@ Item { max: 0 tickCount: 4 labelsColor: "white" - labelsFont.pixelSize: Qt.application.font.pixelSize * 0.7 + labelsFont: apx.font_narrow(Style.fontSize * 0.75) gridLineColor: "#555" } From 36dbe2cceb154a08eadd089ab7a6f8058729ae6a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 2 May 2026 01:59:41 +0300 Subject: [PATCH 098/163] Button tooltip refactoring. --- .../Tools/FilteredCharts/FilteredCharts.qml | 2 -- .../Tools/FilteredCharts/SignalsButton.qml | 25 +++---------------- .../Tools/FilteredCharts/SignalsMenuPage.qml | 19 +++++++++++++- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 7d2d1cbbf..ff340d7d8 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -190,8 +190,6 @@ Rectangle { property int pageIndex: index pageFact: modelData - values: pageFact.values - // checked: control.selectedPageFact // ? pageFact === control.selectedPageFact // : index === 0 diff --git a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml index bfcd49495..8884c279f 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml @@ -30,9 +30,9 @@ TextButton { id: sgBtn property var pageFact: null - property var values: [] - property string pageToolTip: "" - property bool pageWarning: false + property var values: pageFact ? pageFact.values : [] + property string pageToolTip: pageFact ? pageFact.pageToolTip : "" + property bool pageWarning: pageFact ? pageFact.warnings : false property var speed: pageFact ? pageFact.speed : 1 Layout.fillHeight: true @@ -40,7 +40,7 @@ TextButton { ButtonGroup.group: buttonGroup text: pageFact ? pageFact.title.slice(0, 3) : getDefaultText() textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor - toolTip: pageToolTip !== "" ? pageToolTip : getToolTip(values) + toolTip: pageFact ? pageFact.pageToolTip : "" onCheckedChanged: { if (!pageFact) @@ -72,23 +72,6 @@ TextButton { }); } - function getToolTip(facts) { - var s = []; - s.push("" + text + ""); - for (var i = 0; i < facts.length; ++i) { - var fact = facts[i]; - if (!fact) - continue; - var color = fact.color ? fact.color : (fact.opts ? fact.opts.color : undefined); - var label = fact.title ? fact.title : (fact.descr ? fact.descr : fact.bind); - if (color) - s.push("\u25A0 " + label); - else - s.push(label); - } - return s.join("
"); - } - function getDefaultText() { return "#" + buttonGroup.buttons.indexOf(this); } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index d5bd7c403..3f89e19d7 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -30,6 +30,8 @@ Fact { property var newItem: false property bool changes: false + property bool warning: false + property string pageToolTip: "" property alias speed: mSpeed.value property var charts //from config property var values: [] @@ -53,7 +55,7 @@ Fact { values = []; for (var i = 0; i < mCharts.size; ++i) values.push(mCharts.child(i)); - // sgBtn.updateToolTip(sgBtn.values); + updateToolTip(); } function updateChartsValues() { @@ -153,6 +155,21 @@ Fact { descr = descrList.length > 0 ? descrList.join(", ") : ""; } + function updateToolTip() { + var s = []; + s.push("" + title + ""); + for (var i = 0; i < mCharts.size; ++i) { + var fact = mCharts.child(i) + var color = fact.color ? fact.color : (fact.opts ? fact.opts.color : undefined); + var label = fact.title ? fact.title : (fact.descr ? fact.descr : fact.bind); + if (color) + s.push("\u25A0 " + label); + else + s.push(label); + } + pageToolTip = s.join("
"); + } + Fact { id: mPageName title: qsTr("Page name") From dd3d3574cdd990ecb4d03c48a39c79f6f59a70ba Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sat, 2 May 2026 03:39:13 +0300 Subject: [PATCH 099/163] Warnings implementation added. --- .../Tools/FilteredCharts/SignalsButton.qml | 1 + .../Tools/FilteredCharts/SignalsMenuChart.qml | 26 ++++++++++++++++--- .../Tools/FilteredCharts/SignalsMenuPage.qml | 17 ++++++++++-- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml index 8884c279f..177715aec 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml @@ -41,6 +41,7 @@ TextButton { text: pageFact ? pageFact.title.slice(0, 3) : getDefaultText() textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor toolTip: pageFact ? pageFact.pageToolTip : "" + Material.background: pageWarning ? Material.color(Material.Orange) : color onCheckedChanged: { if (!pageFact) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index d00bd4d72..e0dbc3cee 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -33,12 +33,14 @@ Fact { property bool changes: false property bool newItem: false - property var warning: "" + property bool warning: false + property var warningMsg: "" property var data: ({}) // Chart values property var type: "none" property var expr: "" + property var exprW: "" property var scr: "" signal addTriggered @@ -93,6 +95,7 @@ Fact { function updateChartVars() { expr = mBind.text; + exprW = mWarn.text; type = mFilters.value; scr = mFact2Save.text; if (type === "kalman_smp") { @@ -162,6 +165,21 @@ Fact { } } + function updateWarning () { + try { + if(exprW === "") + return; + var v = new Function('return ' + exprW)(); + if (v === undefined) + throw new Error(qsTr("expression is undefined")); + if(typeof v !== 'boolean') + throw new Error(qsTr("wrong warning condition (not true/false)")); + warning = v; + } catch (e) { + chartWarning(e.message); + } + } + function saveValue2Fact() { var fname = scr; if (!fname || fname === "" || fname === undefined) @@ -176,9 +194,9 @@ Fact { } function chartWarning(msg) { - if (warning == msg && timer.running) + if (warningMsg == msg && timer.running) return; - warning = msg; + warningMsg = msg; console.warn(qsTr("Chart") + " " + title + ": " + msg); timer.restart(); } @@ -223,10 +241,12 @@ Fact { descr: qsTr("Filters settings") } Fact { + id: mWarn name: "warn" title: qsTr("Warning") descr: qsTr("Expression for warning") flags: Fact.Text + onTextChanged: changes = true } Fact { id: mFact2Save diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 3f89e19d7..3b4a134a0 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -30,7 +30,7 @@ Fact { property var newItem: false property bool changes: false - property bool warning: false + property bool warnings: false property string pageToolTip: "" property alias speed: mSpeed.value property var charts //from config @@ -59,8 +59,21 @@ Fact { } function updateChartsValues() { - for (var i = 0; i < mCharts.size; ++i) + for (var i = 0; i < mCharts.size; ++i) { mCharts.child(i).updateValue(); + mCharts.child(i).updateWarning(); + } + updatePageWarning(); + } + + function updatePageWarning() { + for (var i = 0; i < mCharts.size; ++i) { + if(mCharts.child(i).warning) { + warnings = true; + return; + } + } + warnings = false; } function save() { From 117b876d5611e83ef4d7e241cd17d075dfaaeb68 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 3 May 2026 02:21:24 +0300 Subject: [PATCH 100/163] Pinned charts added. --- .../Tools/FilteredCharts/FilteredCharts.qml | 83 ++++++++++++++++++- .../Tools/FilteredCharts/SignalsMenuPage.qml | 14 ++-- .../Tools/FilteredCharts/SignalsMenuSet.qml | 15 +++- 3 files changed, 101 insertions(+), 11 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index ff340d7d8..6ff35fb4c 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -38,6 +38,7 @@ Rectangle { readonly property var pages: sgMenu.getActivePages() readonly property var activeSet: sgMenu.getActiveSet() readonly property var activePage: sgMenu.getActivePage() + readonly property var pinnedPages: activeSet.pinnedPages Component.onCompleted: { for (var i = 0; i < buttonGroup.buttons.length; ++i) { @@ -73,7 +74,7 @@ Rectangle { function changeSpeed() { if (!activePage) return; - var newSpeed = 1; + // var newSpeed = 1; if (sgMainChart.speedFactorValue !== sgMainChart.speedFactor[sgMainChart.speedFactor.length - 1]) { for (var i = 0; i < sgMainChart.speedFactor.length - 1; ++i) { if (sgMainChart.speedFactor[i] <= sgMainChart.speedFactorValue && sgMainChart.speedFactorValue < sgMainChart.speedFactor[i + 1]) { @@ -91,12 +92,86 @@ Rectangle { anchors.fill: parent spacing: 0 + Repeater { + model: sgControl.pinnedPages + + delegate: Item { + id: pinnedChartArea + + required property var modelData + required property int index + + property var pinnedPageFact: modelData + + Layout.fillWidth: true + Layout.preferredHeight: 110 * ui.scale + Layout.minimumHeight: 20 + + SignalsChartView { + id: sgPinnedChart + anchors.fill: parent + facts: pinnedPageFact ? pinnedPageFact.values : [] + speedFactorValue: pinnedPageFact ? pinnedPageFact.speed : 1 + } + + Rectangle { + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: 4 * ui.scale + radius: 2 * ui.scale + visible: lblPinnedPage.text !== "" + color: maPinned.containsMouse ? "#50ffffff" : "#30ffffff" + implicitWidth: columnPinnedPage.implicitWidth + 10 * ui.scale + implicitHeight: columnPinnedPage.implicitHeight + 4 * ui.scale + + Column { + id: columnPinnedPage + anchors.centerIn: parent + Label { + id: lblPinnedPage + anchors.horizontalCenter: parent.horizontalCenter + text: pinnedPageFact ? pinnedPageFact.title : "" + font: apx.font_narrow(Style.fontSize * 0.8) + } + Label { + id: lblPinnedSpeed + anchors.right: parent.right + text: sgPinnedChart.speedFactorValue + "x" + font: apx.font_narrow(Style.fontSize * 0.8) + } + } + MouseArea { + id: maPinned + anchors.fill: parent + acceptedButtons: Qt.LeftButton + hoverEnabled: true + onClicked: changePinnedSpeed() + } + } + + function changePinnedSpeed() { + if(!pinnedPageFact) + return; + if (sgPinnedChart.speedFactorValue !== sgPinnedChart.speedFactor[sgPinnedChart.speedFactor.length - 1]) { + for (var i = 0; i < sgPinnedChart.speedFactor.length - 1; ++i) { + if (sgPinnedChart.speedFactor[i] <= sgPinnedChart.speedFactorValue && sgPinnedChart.speedFactorValue < sgPinnedChart.speedFactor[i + 1]) { + pinnedPageFact.speed = sgPinnedChart.speedFactor[i + 1]; + break; + } + } + } else { + pinnedPageFact.speed = sgMainChart.speedFactor[0]; + } + } + } + } + Item { id: mainChartArea Layout.fillWidth: true Layout.fillHeight: true Layout.minimumHeight: 20 - Layout.preferredHeight: 130 * ui.scale + Layout.preferredHeight: 110 * ui.scale // 130 * ui.scale clip: true SignalsChartView { @@ -112,7 +187,7 @@ Rectangle { visible: lblMainPage.text !== "" implicitWidth: columnMainPage.implicitWidth + 10 * ui.scale implicitHeight: columnMainPage.implicitHeight + 4 * ui.scale - color: mouseArea.containsMouse ? "#50ffffff" : "#30ffffff" + color: maMain.containsMouse ? "#50ffffff" : "#30ffffff" opacity: 0.7 Column { @@ -132,7 +207,7 @@ Rectangle { } } MouseArea { - id: mouseArea + id: maMain anchors.fill: parent acceptedButtons: Qt.LeftButton hoverEnabled: true diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 3b4a134a0..b8bcdee85 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -33,6 +33,7 @@ Fact { property bool warnings: false property string pageToolTip: "" property alias speed: mSpeed.value + property alias pinned: mPinned.value property var charts //from config property var values: [] property var data: ({}) @@ -55,7 +56,7 @@ Fact { values = []; for (var i = 0; i < mCharts.size; ++i) values.push(mCharts.child(i)); - updateToolTip(); + updateToolTip(); } function updateChartsValues() { @@ -63,12 +64,12 @@ Fact { mCharts.child(i).updateValue(); mCharts.child(i).updateWarning(); } - updatePageWarning(); + updatePageWarning(); } function updatePageWarning() { for (var i = 0; i < mCharts.size; ++i) { - if(mCharts.child(i).warning) { + if (mCharts.child(i).warning) { warnings = true; return; } @@ -97,7 +98,8 @@ Fact { function load(page) { mPageName.value = page.title; mSpeed.value = page.speed ? page.speed : 1; - mPinned.value = charts = page.charts; + mPinned.value = page.pinned; + charts = page.charts; updateSetItems(); changes = false; } @@ -172,7 +174,7 @@ Fact { var s = []; s.push("" + title + ""); for (var i = 0; i < mCharts.size; ++i) { - var fact = mCharts.child(i) + var fact = mCharts.child(i); var color = fact.color ? fact.color : (fact.opts ? fact.opts.color : undefined); var label = fact.title ? fact.title : (fact.descr ? fact.descr : fact.bind); if (color) @@ -197,7 +199,7 @@ Fact { descr: qsTr("Pin this page to the signals layout") flags: Fact.Bool icon: "pin" - onValueChanged: console.log("Not implemented") + onValueChanged: setFact.updatePinnedPages() } Fact { id: mSpeed diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index df770705f..a08483c42 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -32,6 +32,7 @@ Fact { property bool newItem: false // property bool changes: false property var pages //from config + property var pinnedPages: [] property var data: ({}) signal selected(var num) @@ -125,6 +126,18 @@ Fact { descr = descrList.length > 0 ? descrList.join(", ") : ""; } + function updatePinnedPages() { + var pages = []; + for (var i = 0; i < mPages.size; ++i) { + var f = mPages.child(i); + if (!f) + continue; + if (f.pinned) + pages.push(f); + } + pinnedPages = pages.length > 0 ? pages : []; + } + function getPages() { var pages = []; for (var i = 0; i < mPages.size; ++i) { @@ -141,7 +154,7 @@ Fact { var f = mPages.child(i); if (!f) continue; - if(f.active) + if (f.active) return f; } return null; From acfd73a37d8ec9ed8fe1153716c2bb376cdfb921 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 3 May 2026 23:00:18 +0300 Subject: [PATCH 101/163] Signals chart refactoring. --- .../Tools/FilteredCharts/FilteredCharts.qml | 39 ++++++---------- .../Tools/FilteredCharts/SignalsButton.qml | 9 +--- .../Tools/FilteredCharts/SignalsChartView.qml | 2 +- .../Tools/FilteredCharts/SignalsMenu.qml | 46 ++----------------- .../Tools/FilteredCharts/SignalsMenuPage.qml | 2 - .../Tools/FilteredCharts/SignalsMenuSet.qml | 23 +--------- 6 files changed, 24 insertions(+), 97 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 6ff35fb4c..340e8e3c5 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -41,16 +41,10 @@ Rectangle { readonly property var pinnedPages: activeSet.pinnedPages Component.onCompleted: { - for (var i = 0; i < buttonGroup.buttons.length; ++i) { - var b = buttonGroup.buttons[i]; - if (b.text !== sgControl.currentPage) - continue; - buttonGroup.checkedButton = b; - break; - } - //if (buttonGroup.checkedButton == null) { - // buttonGroup.checkedButton = buttonGroup.buttons[0]; // check button #1 - //} + if (buttonGroup.buttons.length <= 0) + return; + if (buttonGroup.checkedButton == null) + buttonGroup.checkedButton = buttonGroup.buttons[0]; // check button #1 } Connections { @@ -74,7 +68,6 @@ Rectangle { function changeSpeed() { if (!activePage) return; - // var newSpeed = 1; if (sgMainChart.speedFactorValue !== sgMainChart.speedFactor[sgMainChart.speedFactor.length - 1]) { for (var i = 0; i < sgMainChart.speedFactor.length - 1; ++i) { if (sgMainChart.speedFactor[i] <= sgMainChart.speedFactorValue && sgMainChart.speedFactorValue < sgMainChart.speedFactor[i + 1]) { @@ -85,12 +78,12 @@ Rectangle { } else { activePage.speed = sgMainChart.speedFactor[0]; } + autosaveTimer.restart(); } ColumnLayout { id: layout anchors.fill: parent - spacing: 0 Repeater { model: sgControl.pinnedPages @@ -106,7 +99,7 @@ Rectangle { Layout.fillWidth: true Layout.preferredHeight: 110 * ui.scale Layout.minimumHeight: 20 - + SignalsChartView { id: sgPinnedChart anchors.fill: parent @@ -130,7 +123,7 @@ Rectangle { Label { id: lblPinnedPage anchors.horizontalCenter: parent.horizontalCenter - text: pinnedPageFact ? pinnedPageFact.title : "" + text: pinnedPageFact ? pinnedPageFact.title : "" font: apx.font_narrow(Style.fontSize * 0.8) } Label { @@ -150,7 +143,7 @@ Rectangle { } function changePinnedSpeed() { - if(!pinnedPageFact) + if (!pinnedPageFact) return; if (sgPinnedChart.speedFactorValue !== sgPinnedChart.speedFactor[sgPinnedChart.speedFactor.length - 1]) { for (var i = 0; i < sgPinnedChart.speedFactor.length - 1; ++i) { @@ -162,6 +155,7 @@ Rectangle { } else { pinnedPageFact.speed = sgMainChart.speedFactor[0]; } + autosaveTimer.restart(); } } } @@ -265,21 +259,12 @@ Rectangle { property int pageIndex: index pageFact: modelData - // checked: control.selectedPageFact - // ? pageFact === control.selectedPageFact - // : index === 0 - // pageToolTip: control.pageState(index).toolTip - // pageWarning: control.pageState(index).warning - // onEditTriggered: control.openPageEditor(pageFact) } } IconButton { iconName: "plus" toolTip: qsTr("Edit chart configuration") onClicked: sgMenu.trigger() - // SignalsMenu { - // id: sgMenu - // } } } } @@ -287,4 +272,10 @@ Rectangle { SignalsMenu { id: sgMenu } + + Timer { + id: autosaveTimer + interval: 1000 + onTriggered: sgMenu.saveSettings() + } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml index 177715aec..47213d819 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml @@ -46,7 +46,7 @@ TextButton { onCheckedChanged: { if (!pageFact) return; - if (checked) + if (checked) sgMainChart.speedFactorValue = pageFact.speed; pageFact.active = checked; } @@ -92,14 +92,9 @@ TextButton { function getScrMatches(val) { return sgMenuPage.checkScrs(val); } + // Timer { // id: timer // interval: 10000 // } - - Timer { - id: saveTimer - interval: 1000 - onTriggered: sgMenu.saveSettings() - } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsChartView.qml b/src/Plugins/Tools/FilteredCharts/SignalsChartView.qml index 2b2f7f872..bb60e5867 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsChartView.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsChartView.qml @@ -115,7 +115,7 @@ Item { max: 0 tickCount: 4 labelsColor: "white" - labelsFont: apx.font_narrow(Style.fontSize * 0.75) + labelsFont: apx.font_narrow(Style.fontSize * 0.7) gridLineColor: "#555" } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 8c6c6d99a..0b92f72b6 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -27,6 +27,7 @@ Fact { id: sgMenu property var defaults property bool destroyOnClose: true + readonly property string configs: "signals_2.json" // TODO: rename to "signals.json" after all tests name: "signals" flags: (Fact.Group | Fact.DragChildren) @@ -34,34 +35,8 @@ Fact { descr: qsTr("Realtime chart configuration editor") icon: "gauge" - // signal accepted - - // Component.onCompleted: open() - Component.onCompleted: loadSettings() - // function open() { - // //ensure mandala linked to unit - // if (!parentFact) { - // var p = parent; - // parentFact = apx.fleet.local; - // parent = p; - // } - // loadSettings(); - // } - - // function close() { - // if (!destroyOnClose) { - // sgMenu.deleteChildren(); - // loadSettings(); - // menuBack(); - // return; - // } - // sgMenu.deleteChildren(); - // menuBack(); - // parentFact = null; - // } - function getCharts() { var charts = []; for (var i = 0; i < arguments.length; i++) { @@ -131,18 +106,9 @@ Fact { return set; } - // function createDefaultSignals() { - // return { - // "active": { - // "signals": 0 - // }, - // "sets": [createDefaultSet()] - // }; - // } - function loadSettings() { var sets = []; - var f = application.prefs.loadFile("signals_2.json"); + var f = application.prefs.loadFile(configs); var json = f ? JSON.parse(f) : {}; var set = {}; var currentSetIdx = -1; @@ -180,7 +146,7 @@ Fact { } function saveSettings() { - var fjson = application.prefs.loadFile("signals_2.json"); + var fjson = application.prefs.loadFile(configs); var json = fjson ? JSON.parse(fjson) : {}; if (!json.active) json.active = {}; @@ -195,10 +161,8 @@ Fact { if (setFact.active) json.active[name] = i; } - application.prefs.saveFile("signals_2.json", JSON.stringify(json, ' ', 2)); - // accepted(); - // close(); - console.log("Signals settings saved") + application.prefs.saveFile(configs, JSON.stringify(json, ' ', 2)); + console.log("Signals settings saved"); } function createFact(parent, url, opts) { diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index b8bcdee85..7ae6e2b1a 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -231,9 +231,7 @@ Fact { title: qsTr("Charts") flags: (Fact.Group | Fact.Section | Fact.DragChildren) onSizeChanged: { - // New functionality updateDescr(); - // ================= sgMainChart.resetEnable = true; } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index a08483c42..5b4cd7a15 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -33,6 +33,7 @@ Fact { // property bool changes: false property var pages //from config property var pinnedPages: [] + property var activePage: 0 property var data: ({}) signal selected(var num) @@ -41,22 +42,6 @@ Fact { Component.onCompleted: load(data) Component.onDestruction: removed() // pinned menu closes when the plugin is closed - // function addNewPage() { - // mMenuPage.trigger(); - // } - - // function updateBtnValues() { - // sgBtn.values = []; - // for (var i = 0; i < mPages.size; ++i) - // sgBtn.values.push(mPages.child(i)); - // sgBtn.updateToolTip(sgBtn.values); - // } - - // function updateChartsValues() { - // for (var i = 0; i < mPages.size; ++i) - // mPages.child(i).updateValue(); - // } - function save() { // changes = false; var tmpPages = []; @@ -85,7 +70,6 @@ Fact { } function createPage(mset) { - // function createPage() { var text = mset.title.trim(); if (text == "") mset.title = "P" + (mPages.size + 1); @@ -94,11 +78,6 @@ Fact { var c = createFact(mPages, "SignalsMenuPage.qml", { "data": mset }); - // var page = {}; - // page.values = []; - // var c = createFact(mPages, "SignalsMenuPage.qml", page); - // c.trigger(); - // c.removeTriggered.connect(function () { // // changes = true; // }); From 2eb6ecff4b0b756c4432e15d64c7a013faa8d19e Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Sun, 3 May 2026 23:29:35 +0300 Subject: [PATCH 102/163] Fix icon button size. --- src/Plugins/Tools/FilteredCharts/FilteredCharts.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 340e8e3c5..30ffdc192 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -264,6 +264,8 @@ Rectangle { IconButton { iconName: "plus" toolTip: qsTr("Edit chart configuration") + Layout.fillHeight: true + Layout.minimumWidth: height onClicked: sgMenu.trigger() } } From 0b62b039235582c082d104228951f2e2fa66d0fc Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 01:25:18 +0300 Subject: [PATCH 103/163] Add active page saving. --- .../Tools/FilteredCharts/SignalsButton.qml | 5 +++- .../Tools/FilteredCharts/SignalsMenu.qml | 1 - .../Tools/FilteredCharts/SignalsMenuPage.qml | 4 ++++ .../Tools/FilteredCharts/SignalsMenuSet.qml | 24 ++++++++++++------- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml index 47213d819..0c6225db6 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml @@ -42,12 +42,15 @@ TextButton { textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor toolTip: pageFact ? pageFact.pageToolTip : "" Material.background: pageWarning ? Material.color(Material.Orange) : color + checked: pageFact ? pageFact.active : false onCheckedChanged: { if (!pageFact) return; - if (checked) + if (checked) { sgMainChart.speedFactorValue = pageFact.speed; + autosaveTimer.restart(); + } pageFact.active = checked; } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 0b92f72b6..cce001941 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -102,7 +102,6 @@ Fact { } ] }; - return set; } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 7ae6e2b1a..ed8047fd9 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -47,6 +47,10 @@ Fact { updateTitle(); updateDescr(); } + onActiveChanged: { + if (active) + setFact.checked = num; + } function addNewChart() { mMenuChart.trigger(); diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 5b4cd7a15..2347200e6 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -33,7 +33,7 @@ Fact { // property bool changes: false property var pages //from config property var pinnedPages: [] - property var activePage: 0 + property var checked: 0 property var data: ({}) signal selected(var num) @@ -51,15 +51,18 @@ Fact { } var set = {}; set.title = mSetName.value; + set.checked = checked; set.pages = tmpPages; return set; } function load(set) { mSetName.value = set.title; + checked = set.checked; pages = set.pages; updateSetItems(); - // changes = false; + updateCheckedPage(); + // changes = false; } function updateSetItems() { @@ -69,14 +72,19 @@ Fact { } } - function createPage(mset) { - var text = mset.title.trim(); + function updateCheckedPage() { + for (var i = 0; i < mPages.size; ++i) + mPages.child(i).active = i == checked; + } + + function createPage(mpage) { + var text = mpage.title.trim(); if (text == "") - mset.title = "P" + (mPages.size + 1); - if (mset.speed <= 0) - mset.speed = 1; + mpage.title = "P" + (mPages.size + 1); + if (mpage.speed <= 0) + mpage.speed = 1; var c = createFact(mPages, "SignalsMenuPage.qml", { - "data": mset + "data": mpage }); // c.removeTriggered.connect(function () { // // changes = true; From 76bff891c9ff5a2b7fbfa009baa2157ac51824c6 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 02:29:25 +0300 Subject: [PATCH 104/163] Script warnings refactoring. --- .../Tools/FilteredCharts/FilteredCharts.qml | 5 +++++ .../Tools/FilteredCharts/SignalsButton.qml | 17 ----------------- .../Tools/FilteredCharts/SignalsMenuChart.qml | 9 ++++----- .../Tools/FilteredCharts/SignalsMenuPage.qml | 6 ++---- .../Tools/FilteredCharts/SignalsMenuSet.qml | 7 ++++++- 5 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 30ffdc192..623a02419 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -280,4 +280,9 @@ Rectangle { interval: 1000 onTriggered: sgMenu.saveSettings() } + + Timer { + id: warnTimer + interval: 10000 + } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml index 0c6225db6..8c95abe69 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml @@ -80,24 +80,7 @@ TextButton { return "#" + buttonGroup.buttons.indexOf(this); } - function callQuickChart() { - sgMenuPage.addNewChart(); - } - - function getSet() { - return sgMenuPage.save(); - } - - function loadSet(set) { - sgMenuPage.load(set); - } - function getScrMatches(val) { return sgMenuPage.checkScrs(val); } - - // Timer { - // id: timer - // interval: 10000 - // } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index e0dbc3cee..47d13c46d 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -194,18 +194,17 @@ Fact { } function chartWarning(msg) { - if (warningMsg == msg && timer.running) + if (warningMsg == msg && warnTimer.running) return; warningMsg = msg; console.warn(qsTr("Chart") + " " + title + ": " + msg); - timer.restart(); + warnTimer.restart(); } function hasScr(val) { if (!val || val !== scr) - return false; + return; chartWarning(val + " " + qsTr("variable already used")); - return true; } Fact { @@ -256,7 +255,7 @@ Fact { flags: Fact.Int units: "mandala" onTextChanged: { - sgControl.checkScrMatches(text); + setFact.checkScrMatches(text); changes = true; } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index ed8047fd9..6475d1a0d 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -139,12 +139,10 @@ Fact { } } + // Check for binding script variable matches function checkScrs(val) { - var matches = false; for (var i = 0; i < mCharts.size; ++i) - if (mCharts.child(i).hasScr(val)) - matches = true; - return matches; + mCharts.child(i).hasScr(val) } function updateTitle() { diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 2347200e6..0dac070e1 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -147,6 +147,12 @@ Fact { return null; } + // Check for binding script variable matches + function checkScrMatches(val) { + for (var i = 0; i < mPages.size; ++i) + mPages.child(i).checkScrs(val) + } + Fact { id: mSetName title: qsTr("Set name") @@ -164,7 +170,6 @@ Fact { descr: qsTr("Creating and add new page") icon: "plus-circle" newItem: true - // onAddTriggered: createPage() onAddTriggered: createPage(save()) } Fact { From e3c06d530d76577cb0c3de957e68d08a29402b74 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 13:30:14 +0300 Subject: [PATCH 105/163] Filters save button logic update. --- .../SignalsFilterKalmanSimple.qml | 8 ++++--- .../SignalsFilterRunningAvg.qml | 7 +++++-- .../FilteredCharts/SignalsMenuFilters.qml | 21 +++++++++++++++++-- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml index dcc586537..2c42bbd80 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml @@ -36,8 +36,11 @@ Fact { property var envCoef: 1 property var data: ({}) + onValueChanged: changes = true + onChangesChanged: {if (changes) fMenu.changes = true} Component.onCompleted: load(data) - // onChangesChanged: { if (changes) fMenu.changes = true;} + + signal changed(var changesValue) function load(data) { value = data.value !== undefined ? data.value : 0 @@ -81,7 +84,6 @@ Fact { function updateCoefs() { measCoef = ksMeasNoise.value; envCoef = ksEnvNoise.value; - // coefs = [ksMeasNoise.value, ksEnvNoise.value] changes = false; } @@ -136,7 +138,7 @@ Fact { Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - // enabled: !mChart.newItem && changes + enabled: !mChart.newItem && changes icon: "check-circle" onTriggered: sgMenu.saveSettings() } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml index cad3e7b08..15c11fba6 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml @@ -35,8 +35,11 @@ Fact { property var data: ({}) property var coef: 1 + onValueChanged: changes = true; + onChangesChanged: changed(changes) Component.onCompleted: load(data) - // onChangesChanged: { if (changes) fMenu.changes = true;} + + signal changed(var changesValue) function load(data) { value = data.value !== undefined ? data.value : 0 @@ -105,7 +108,7 @@ Fact { Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - // enabled: !mChart.newItem && changes + enabled: !mChart.newItem && changes icon: "check-circle" onTriggered: sgMenu.saveSettings() } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml index 6c933e842..a41c9707e 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml @@ -57,7 +57,8 @@ Fact { tmpFilters.push(mfilter); } var fmenu = {}; - fmenu.filters = tmpFilters; + fmenu.filters = tmpFilters; + changes = false; return fmenu; } @@ -95,6 +96,21 @@ Fact { }); } + function createFact(parent, url, opts) { + var component = Qt.createComponent(url); + if (component.status === Component.Ready) { + var c = component.createObject(parent, opts); + c.parentFact = parent; + c.changed.connect(setChanges) + return c; + } + } + + function setChanges(changesValue) { + if(changesValue) + fMenu.changes = changesValue; + } + // Using filters function useFilters(value, v) { for(var i = 0; i < fSet.size; ++i) { @@ -121,13 +137,14 @@ Fact { id: fSet title: qsTr("Filters") flags: (Fact.Group | Fact.Section | Fact.DragChildren) + onSizeChanged: changes = true } // Actions Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - // enabled: !mChart.newItem && changes + enabled: !mChart.newItem && changes icon: "check-circle" onTriggered: sgMenu.saveSettings() } From d99145e9e4221ea7ac5081c4cee3df289f5e7da3 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 14:26:20 +0300 Subject: [PATCH 106/163] Set and page saving button updated. --- .../Tools/FilteredCharts/SignalsMenuChart.qml | 2 +- .../Tools/FilteredCharts/SignalsMenuPage.qml | 12 +++++++++--- .../Tools/FilteredCharts/SignalsMenuSet.qml | 17 ++++++----------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index 47d13c46d..a662908c5 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -58,6 +58,7 @@ Fact { } onValueChanged: saveValue2Fact() + onChangesChanged: {if (changes) pageFact.changes = true} function load(data) { for (var i = 0; i < mChart.size; ++i) { @@ -65,7 +66,6 @@ Fact { var v = data[settingName(f)]; f.value = v; } - // mFilters.fillData(); updateChartVars(); } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 6475d1a0d..ddd2398d0 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -150,10 +150,13 @@ Fact { return; var text = mPageName.text.trim(); title = text != "" ? text : qsTr("P") + (Math.max(pageFact.num, 0) + 1); + changes = true; } function updateDescr() { var descrList = []; + if(mPinned.value) + descrList.push("PINNED") var speedDescr = "SPEED: " + mSpeed.value; descrList.push(speedDescr); var descrCharts = []; @@ -170,6 +173,7 @@ Fact { descrList.push(chartsDescr); } descr = descrList.length > 0 ? descrList.join(", ") : ""; + changes = true; } function updateToolTip() { @@ -201,7 +205,10 @@ Fact { descr: qsTr("Pin this page to the signals layout") flags: Fact.Bool icon: "pin" - onValueChanged: setFact.updatePinnedPages() + onValueChanged: { + setFact.updatePinnedPages() + updateDescr(); + } } Fact { id: mSpeed @@ -217,7 +224,6 @@ Fact { if (active && setFact.active) sgMainChart.speedFactorValue = value; updateDescr(); - // changes = true; } } SignalsMenuChart { @@ -253,7 +259,7 @@ Fact { Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - enabled: !newItem + enabled: !newItem && changes icon: "check-circle" onTriggered: sgMenu.saveSettings() } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 0dac070e1..7d0fe3d31 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -29,8 +29,7 @@ Fact { flags: (Fact.Group | Fact.FlatModel) title: "Set" - property bool newItem: false - // property bool changes: false + property bool changes: false property var pages //from config property var pinnedPages: [] property var checked: 0 @@ -43,7 +42,7 @@ Fact { Component.onDestruction: removed() // pinned menu closes when the plugin is closed function save() { - // changes = false; + changes = false; var tmpPages = []; for (var i = 0; i < mPages.size; ++i) { var mpage = mPages.child(i).save(); @@ -62,7 +61,7 @@ Fact { pages = set.pages; updateSetItems(); updateCheckedPage(); - // changes = false; + changes = false; } function updateSetItems() { @@ -86,10 +85,6 @@ Fact { var c = createFact(mPages, "SignalsMenuPage.qml", { "data": mpage }); - // c.removeTriggered.connect(function () { - // // changes = true; - // }); - // // changes = true; } function createFact(parent, url, opts) { @@ -111,6 +106,7 @@ Fact { descrList.push(text); } descr = descrList.length > 0 ? descrList.join(", ") : ""; + changes = true; } function updatePinnedPages() { @@ -161,7 +157,7 @@ Fact { icon: "rename-box" onValueChanged: { setFact.title = value; - // changes = true; + changes = true; } } SignalsMenuPage { @@ -183,7 +179,7 @@ Fact { Fact { flags: (Fact.Action | Fact.Apply) title: qsTr("Save") - visible: !newItem // && changes + visible: changes icon: "check-circle" onTriggered: sgMenu.saveSettings() } @@ -200,7 +196,6 @@ Fact { Fact { flags: (Fact.Action | Fact.Remove) title: qsTr("Remove") - visible: !newItem icon: "delete" onTriggered: { if (setFact.num <= 0) { // don't delete default set From 28a95d54d00d7578e4a673c483df932b4df10355 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 15:04:09 +0300 Subject: [PATCH 107/163] Filters small refactoring. --- src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml index 2c42bbd80..c316ff226 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml @@ -40,7 +40,7 @@ Fact { onChangesChanged: {if (changes) fMenu.changes = true} Component.onCompleted: load(data) - signal changed(var changesValue) + signal changed(bool changesValue) function load(data) { value = data.value !== undefined ? data.value : 0 diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml index 15c11fba6..93ab87389 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml @@ -39,7 +39,7 @@ Fact { onChangesChanged: changed(changes) Component.onCompleted: load(data) - signal changed(var changesValue) + signal changed(bool changesValue) function load(data) { value = data.value !== undefined ? data.value : 0 diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml index 1ca7dce41..1f4a3a12f 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml @@ -26,7 +26,7 @@ import APX.Facts Fact { value: "#ffffff" - property var changes: false + property bool changes: false onValueChanged: changes = true onChangesChanged: { if (changes) mChart.changes = true;} From 4ba6f49b71a7558972100c009e4f94d3391f3cce Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 15:08:53 +0300 Subject: [PATCH 108/163] Default signals fix. --- src/Plugins/Tools/FilteredCharts/SignalsMenu.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index cce001941..1b4a02a04 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -59,6 +59,7 @@ Fact { function createDefaultSet() { var set = { "title": "default", + "checked": 0, "pages": [ { "title": "R", From e97e32848e6f83ebc0cfd859231198c99b25a1ec Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 15:19:06 +0300 Subject: [PATCH 109/163] Default set reset updated. --- src/Plugins/Tools/FilteredCharts/SignalsMenu.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 1b4a02a04..88ed71d66 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -199,6 +199,7 @@ Fact { var defaultSet = sgMenu.child(0); defaultSet.data = createDefaultSet(); defaultSet.load(defaultSet.data); + select(0); } function getActiveSetIndex() { @@ -241,7 +242,7 @@ Fact { onTriggered: createSet() } Fact { - title: qsTr("Reset defaults") + title: qsTr("Reset to defaults") flags: Fact.Action icon: "restore" onTriggered: resetToDefaults() From 575f844b64a0fbafc6bafa9c899c3955f94c0411 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 15:27:31 +0300 Subject: [PATCH 110/163] Set remove updated. --- src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 7d0fe3d31..8fb445fc8 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -36,7 +36,6 @@ Fact { property var data: ({}) signal selected(var num) - signal removeTriggered Component.onCompleted: load(data) Component.onDestruction: removed() // pinned menu closes when the plugin is closed @@ -202,7 +201,7 @@ Fact { console.warn(qsTr("Can't delete default set")); return; } - removeTriggered(); + if(setFact.active)select(0) setFact.deleteFact(); } } From a3e59c050f2c85a21f080bc8eb6e37bfbbec001b Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 16:37:11 +0300 Subject: [PATCH 111/163] Default active page creating. --- .../FilteredCharts/SignalsFilterKalmanSimple.qml | 5 +---- .../FilteredCharts/SignalsFilterRunningAvg.qml | 5 +---- .../Tools/FilteredCharts/SignalsMenuChart.qml | 6 +----- .../Tools/FilteredCharts/SignalsMenuFilters.qml | 2 -- .../Tools/FilteredCharts/SignalsMenuPage.qml | 7 ++----- .../Tools/FilteredCharts/SignalsMenuSet.qml | 16 ++++++++++------ 6 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml index c316ff226..a402f6afb 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml @@ -146,9 +146,6 @@ Fact { flags: (Fact.Action | Fact.Remove) title: qsTr("Remove") icon: "delete" - onTriggered: { - removeTriggered(); - ksFilter.deleteFact(); - } + onTriggered: ksFilter.deleteFact(); } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml index 93ab87389..498b4ad94 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml @@ -116,9 +116,6 @@ Fact { flags: (Fact.Action | Fact.Remove) title: qsTr("Remove") icon: "delete" - onTriggered: { - removeTriggered(); - raFilter.deleteFact(); - } + onTriggered: raFilter.deleteFact(); } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index a662908c5..e0dea33c7 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -44,7 +44,6 @@ Fact { property var scr: "" signal addTriggered - signal removeTriggered Component.onCompleted: { load(data); @@ -284,9 +283,6 @@ Fact { title: qsTr("Remove") visible: !newItem icon: "delete" - onTriggered: { - removeTriggered(); - mChart.deleteFact(); - } + onTriggered: mChart.deleteFact(); } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml index a41c9707e..bb727316a 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml @@ -31,8 +31,6 @@ Fact { property bool changes: false property var data: ({}) - signal removeTriggered - Component.onCompleted: load(value) onChangesChanged: { if (changes) mChart.changes = true;} diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index ddd2398d0..db5436621 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -39,7 +39,6 @@ Fact { property var data: ({}) signal addTriggered - signal removeTriggered Component.onDestruction: removed() // pinned menu closes when the plugin is closed Component.onCompleted: { @@ -124,9 +123,6 @@ Fact { var c = createFact(mCharts, "SignalsMenuChart.qml", { "data": mchart }); - c.removeTriggered.connect(function () { - changes = true; - }); changes = true; } @@ -269,8 +265,9 @@ Fact { visible: !newItem icon: "delete" onTriggered: { - removeTriggered(); + var active = pageFact.active; pageFact.deleteFact(); + if(active) setFact.setChecked(0); } } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 8fb445fc8..9a8141a16 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -59,7 +59,7 @@ Fact { checked = set.checked; pages = set.pages; updateSetItems(); - updateCheckedPage(); + setChecked(checked); changes = false; } @@ -70,9 +70,10 @@ Fact { } } - function updateCheckedPage() { - for (var i = 0; i < mPages.size; ++i) - mPages.child(i).active = i == checked; + function setChecked(num) { + for (var i = 0; i < mPages.size; ++i) { + mPages.child(i).active = i == num; + } } function createPage(mpage) { @@ -165,7 +166,10 @@ Fact { descr: qsTr("Creating and add new page") icon: "plus-circle" newItem: true - onAddTriggered: createPage(save()) + onAddTriggered: { + createPage(save()); + if(mPages.size === 1) setChecked(0); + } } Fact { id: mPages @@ -201,7 +205,7 @@ Fact { console.warn(qsTr("Can't delete default set")); return; } - if(setFact.active)select(0) + if (setFact.active) select(0); setFact.deleteFact(); } } From 57dfde3a15ad72fc7e50a94d4760704aaf338b0a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 17:28:34 +0300 Subject: [PATCH 112/163] Filter drag action for saving. --- src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml index bb727316a..22f20e987 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml @@ -136,6 +136,7 @@ Fact { title: qsTr("Filters") flags: (Fact.Group | Fact.Section | Fact.DragChildren) onSizeChanged: changes = true + onItemMoved: changes = true } // Actions From 4a3988266ed2c186be310b88ff4c8803508d7ffd Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 17:39:47 +0300 Subject: [PATCH 113/163] New chart for new page fix. --- src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index db5436621..0f10b7cb9 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -227,6 +227,7 @@ Fact { title: qsTr("Add new chart") descr: qsTr("Creating and setting a new chart") icon: "plus-circle" + visible: !pageFact.newItem newItem: true onAddTriggered: createChart(save()) } From 57878646663caceb5acc380d00e073ea47e3d3ed Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 4 May 2026 19:00:26 +0300 Subject: [PATCH 114/163] Reset to defaults update. --- .../Tools/FilteredCharts/FilteredCharts.qml | 2 +- .../Tools/FilteredCharts/SignalsMenu.qml | 25 +++++++++++++++---- .../Tools/FilteredCharts/SignalsMenuSet.qml | 4 --- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml index 623a02419..1cb23a39d 100644 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml @@ -38,7 +38,7 @@ Rectangle { readonly property var pages: sgMenu.getActivePages() readonly property var activeSet: sgMenu.getActiveSet() readonly property var activePage: sgMenu.getActivePage() - readonly property var pinnedPages: activeSet.pinnedPages + readonly property var pinnedPages: activeSet ? activeSet.pinnedPages : [] Component.onCompleted: { if (buttonGroup.buttons.length <= 0) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 88ed71d66..584f6e0a8 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -194,11 +194,26 @@ Fact { } function resetToDefaults() { - if (sgMenu.size <= 0) - return; - var defaultSet = sgMenu.child(0); - defaultSet.data = createDefaultSet(); - defaultSet.load(defaultSet.data); + var setIndex = -1 + var set = createDefaultSet(); + for(var i = 0; i < sgMenu.size; ++ i) { + var title = sgMenu.child(i).title.trim().toLowerCase() + if (title === "default") { + var defaultSet = sgMenu.child(i); + defaultSet.load(set); + defaultSet.move(0) + setIndex = i; + break; + } + } + if (setIndex < 0) { + var c = createFact(sgMenu, "SignalsMenuSet.qml", { + "data": set + }); + c.selected.connect(select); + c.selected.connect(saveSettings); + c.move(0); + } select(0); } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 9a8141a16..781aded16 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -201,10 +201,6 @@ Fact { title: qsTr("Remove") icon: "delete" onTriggered: { - if (setFact.num <= 0) { // don't delete default set - console.warn(qsTr("Can't delete default set")); - return; - } if (setFact.active) select(0); setFact.deleteFact(); } From 410597940523faca6ee6dc671a370319e848801b Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 5 May 2026 14:07:08 +0300 Subject: [PATCH 115/163] Menu color first implementation (not finished). --- .../FilteredCharts/SignalsColorChooser.qml | 149 +++++++++++++++--- .../FilteredCharts/SignalsColorEditor.qml | 54 +++++++ .../Tools/FilteredCharts/SignalsMenuChart.qml | 11 +- .../Tools/FilteredCharts/SignalsMenuColor.qml | 23 +-- 4 files changed, 202 insertions(+), 35 deletions(-) create mode 100644 src/Plugins/Tools/FilteredCharts/SignalsColorEditor.qml diff --git a/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml b/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml index 63af24aa1..81c81dbb3 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml @@ -8,11 +8,64 @@ import APX.Facts Item { id: colorChooser - property var color: fact.value != undefined ? fact.value : "#ffffff" + property var color: fact.value != "Auto" ? fact.value : "transparent" property var space: Style.spacing * 1.2 + property var colorModel: createColorModel() + readonly property var baseColors: [ + Material.Red, + Material.Pink, + Material.Purple, + Material.DeepPurple, + Material.Indigo, + Material.Blue, + Material.LightBlue, + Material.Cyan, + Material.Teal, + Material.Green, + Material.Orange, + Material.BlueGrey + ] + readonly property var colorShades: [ + Material.Shade300, + Material.Shade500, + Material.Shade700, + Material.Shade900 + ] - implicitWidth: 280 * ui.scale - implicitHeight: 100 * ui.scale + implicitWidth: 480 * ui.scale + implicitHeight: 132 * ui.scale + + function createColorModel() { + var colors = [] + for (var i = 0; i < colorShades.length; ++i) { + for (var j = 0; j < baseColors.length; ++j) { + var colorCode = Material.color(baseColors[j], colorShades[i]).toString().toUpperCase() + colors.push(colorCode) + } + } + return colors; + } + + function setAutoColor() { + console.log("Number: add", fact.parentFact.num) + console.log("Number add chart: ", fact.num) + console.log("newItem", fact.parentFact.newItem) + if (!fact || !fact.parentFact) + return; + var index = 0; + var colorValue = "#FFFFFFF" + if (!fact.parentFact.newItem) { + if(colorModel.length > 0) { + index = fact.parentFact.num % colorModel.length + colorValue = colorModel[index] + } + } else { + index = fact.parentFact.chartsCount + colorValue = colorModel[index] + } + fact.value = colorValue; + console.log("color:", fact.value) + } Rectangle { id: colorBox @@ -21,7 +74,8 @@ Item { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.bottom: colorPreview.top + anchors.bottom: autoColor.top + anchors.bottomMargin: space GridLayout { columns: 12 @@ -31,19 +85,15 @@ Item { rowSpacing: space Repeater { - model: [ - "#ff8a8a", "#ffc0cb", "#eee8aa", "#ffffe0", "#98fb98", "#acbf69", "#add8e6", "#4169e1", "#cf9fff", "#d8bfd8", "#ffebcd", "#ffffff", - "#ff7f50", "#ff69b4", "#ffd580", "#ffff8f", "#00ff00", "#6b8e23", "#87ceeb", "#0000ff", "#da70d6", "#dda0dd", "#deb887", "#d3d3d3", - "#ff4500", "#ff1493", "#ffa500", "#ffff00", "#32cd32", "#556b2f", "#00bfff", "#0000cd", "#bf40bf", "#ee82ee", "#d2691e", "#808080", - "#ff0000", "#dc143c", "#ff8c00", "#ffd700", "#008000", '#3c4d03', "#1e90ff", "#000080", "#800080", "#ba55d3", "#a52a2a", "#000000" - ] + model: colorModel delegate: Rectangle { property var chosen: mouseArea.containsMouse Layout.fillWidth: true Layout.fillHeight: true color: modelData - border.width: 1 + radius: 2 * ui.scale + border.width: 1 * ui.scale border.color: chosen ? "#b0c4de" : "transparent" opacity: chosen ? 1 : 0.85 scale: chosen ? 1.15 : 1.0 @@ -52,33 +102,86 @@ Item { id: mouseArea anchors.fill: parent hoverEnabled: true - onClicked: fact.value = modelData; + onClicked: { + fact.value = modelData; + fact.menuBack() + } } } } } } - RowLayout { - id: colorPreview + Row { + id: autoColor + anchors.left: parent.left anchors.bottom: parent.bottom spacing: space Rectangle { - color: colorChooser.color - width: 24 * ui.scale - height: 16 * ui.scale + color: "transparent" + width: 39 * ui.scale + height: 23 * ui.scale + radius: height / 5 border.width: ui.scale - border.color: "#383838" - Layout.topMargin: space - Layout.leftMargin: space + border.color: Material.hintTextColor + ToolTip.visible: maAutoColor.containsMouse + ToolTip.text: qsTr("Use automatic series color") opacity: 0.85 + + Text { + anchors.centerIn: parent + text: qsTr("A") + font: apx.font_narrow(Math.max(10, parent.height * 0.55)) + color: Material.hintTextColor + } + MouseArea { + id: maAutoColor + anchors.fill: parent + hoverEnabled: true + onClicked: { + setAutoColor() + fact.menuBack() + } + } } Label { - text: colorChooser.color + text: "Auto color selection" font.pixelSize: Style.fontSize * 0.7 - Layout.topMargin: space - Layout.alignment: Qt.AlignVCenter + anchors.verticalCenter: parent.verticalCenter } } + + // RowLayout { + // id: colorPreview + // anchors.bottom: parent.bottom + // spacing: space + + // Rectangle { + // color: "transparent" + // width: 40 * ui.scale + // height: 24 * ui.scale + // radius: height / 5 + // border.width: ui.scale + // // border.color: "#383838" + // border.color: Material.hintTextColor + // Layout.topMargin: space + // Layout.leftMargin: space + // opacity: 0.85 + + // Text { + // anchors.centerIn: parent + // text: qsTr("A") + // font: apx.font_narrow(Math.max(10, parent.height * 0.55)) + // color: Material.hintTextColor + // } + // } + + // Label { + // text: fact.value != "Auto" ? colorChooser.color : "Auto" + // font.pixelSize: Style.fontSize * 0.7 + // Layout.topMargin: space + // Layout.alignment: Qt.AlignVCenter + // } + // } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsColorEditor.qml b/src/Plugins/Tools/FilteredCharts/SignalsColorEditor.qml new file mode 100644 index 000000000..8df19a639 --- /dev/null +++ b/src/Plugins/Tools/FilteredCharts/SignalsColorEditor.qml @@ -0,0 +1,54 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick +import QtQuick.Controls.Material + +Rectangle { + id: editor + + // readonly property string colorText: fact && fact.colorValue !== undefined + // ? String(fact.colorValue).trim().toUpperCase() + // : (fact && fact.itemOwner && fact.itemOwner.colorValue !== undefined + // ? String(fact.itemOwner.colorValue).trim().toUpperCase() + // : "") + // readonly property bool selected: fact && fact.itemOwner + // && fact.itemOwner.colorValue === colorText + + + readonly property string colorText: fact && fact.value !== undefined ? fact.value.trim().toUpperCase() : qsTr("Auto") + readonly property bool auto: colorText.toUpperCase() === "AUTO" + + implicitHeight: factButton.height * 0.6 + implicitWidth: factButton.height * 1.8 + radius: height / 12 + border.width: 2 + border.color: Material.hintTextColor + color: !auto ? colorText : "transparent" + + Text { + anchors.centerIn: parent + text: qsTr("A") + font: apx.font_narrow(Math.max(10, parent.height * 0.55)) + color: Material.hintTextColor + visible: auto + } +} diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index e0dea33c7..19a6d02cc 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -31,6 +31,7 @@ Fact { precision: 2 icon: "rectangle" + property var chartsCount: mCharts.size property bool changes: false property bool newItem: false property bool warning: false @@ -122,10 +123,12 @@ Fact { var f = child(i); if (!f.name) continue; - if (f.name === "title") - continue; + // if (f.name === "title") + // continue; if (f.text === "") continue; + if (f.name === "color") + descrList.push(f.name.toUpperCase() + ": " + f.text.toUpperCase()); else descrList.push(f.name.toUpperCase() + ": " + f.text); } @@ -231,6 +234,10 @@ Fact { name: "color" title: qsTr("Color") descr: qsTr("Chart color") + opts: ({ + "editor": Qt.resolvedUrl("SignalsColorEditor.qml") + }) + value: "#ffffff" } SignalsMenuFilters { id: mFilters diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml index 1f4a3a12f..64a144c63 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml @@ -24,24 +24,27 @@ import QtQuick import APX.Facts Fact { - value: "#ffffff" - property bool changes: false - onValueChanged: changes = true + onValueChanged: updateDescr() onChangesChanged: { if (changes) mChart.changes = true;} Component.onCompleted: { + if (!value || value === undefined) + value = qsTr("Auto") + console.log("Component created", value) + var opt = opts; opt.page = "qrc:/FilteredCharts/SignalsColorChooser.qml"; opts = opt; } - Fact { - id: mApply - flags: (Fact.Action | Fact.Apply) - title: qsTr("Save") - enabled: !mChart.newItem && changes - icon: "check-circle" - onTriggered: sgMenu.saveSettings() + function updateDescr() { + var descrText = ""; + if(!value || value === undefined) + descrText = qsTr("Auto") + else + descrText = value + descr = qsTr("COLOR") + ": " + descrText.toString().toUpperCase(); + changes = true; } } From 66ac7b560d2ef9a6cc945ffd350a29cbcbd2133b Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 5 May 2026 15:45:48 +0300 Subject: [PATCH 116/163] Use color chooser with facts. --- .../FilteredCharts/SignalsColorChooser.qml | 203 +++--------------- .../Tools/FilteredCharts/SignalsMenuChart.qml | 2 +- .../Tools/FilteredCharts/SignalsMenuColor.qml | 89 +++++++- 3 files changed, 117 insertions(+), 177 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml b/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml index 81c81dbb3..ad4169f9e 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml @@ -1,187 +1,48 @@ import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import Apx.Common + import APX.Facts -Item { - id: colorChooser +Fact { + id: colorFact - property var color: fact.value != "Auto" ? fact.value : "transparent" - property var space: Style.spacing * 1.2 - property var colorModel: createColorModel() - readonly property var baseColors: [ - Material.Red, - Material.Pink, - Material.Purple, - Material.DeepPurple, - Material.Indigo, - Material.Blue, - Material.LightBlue, - Material.Cyan, - Material.Teal, - Material.Green, - Material.Orange, - Material.BlueGrey - ] - readonly property var colorShades: [ - Material.Shade300, - Material.Shade500, - Material.Shade700, - Material.Shade900 - ] + property string colorValue: "" - implicitWidth: 480 * ui.scale - implicitHeight: 132 * ui.scale + flags: Fact.CloseOnTrigger + opts: ({ + "editor": Qt.resolvedUrl("SignalsColorEditor.qml") + }) - function createColorModel() { - var colors = [] - for (var i = 0; i < colorShades.length; ++i) { - for (var j = 0; j < baseColors.length; ++j) { - var colorCode = Material.color(baseColors[j], colorShades[i]).toString().toUpperCase() - colors.push(colorCode) - } - } - return colors; - } + onTriggered: setColor() - function setAutoColor() { - console.log("Number: add", fact.parentFact.num) - console.log("Number add chart: ", fact.num) - console.log("newItem", fact.parentFact.newItem) - if (!fact || !fact.parentFact) + function setColor() { + if(!parentFact) + return; + if(title === "Auto") { + setAutoColor() return; - var index = 0; - var colorValue = "#FFFFFFF" - if (!fact.parentFact.newItem) { - if(colorModel.length > 0) { - index = fact.parentFact.num % colorModel.length - colorValue = colorModel[index] - } - } else { - index = fact.parentFact.chartsCount - colorValue = colorModel[index] } - fact.value = colorValue; - console.log("color:", fact.value) + parentFact.value = colorValue; } - - Rectangle { - id: colorBox - border.width: 0 - color: "#282828" - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: autoColor.top - anchors.bottomMargin: space - - GridLayout { - columns: 12 - anchors.fill: parent - anchors.margins: space - columnSpacing: space - rowSpacing: space - - Repeater { - model: colorModel - delegate: Rectangle { - property var chosen: mouseArea.containsMouse - Layout.fillWidth: true - Layout.fillHeight: true - color: modelData - radius: 2 * ui.scale - border.width: 1 * ui.scale - border.color: chosen ? "#b0c4de" : "transparent" - opacity: chosen ? 1 : 0.85 - scale: chosen ? 1.15 : 1.0 - - MouseArea { - id: mouseArea - anchors.fill: parent - hoverEnabled: true - onClicked: { - fact.value = modelData; - fact.menuBack() - } - } - } - } - } - } - Row { - id: autoColor - anchors.left: parent.left - anchors.bottom: parent.bottom - spacing: space - - Rectangle { - color: "transparent" - width: 39 * ui.scale - height: 23 * ui.scale - radius: height / 5 - border.width: ui.scale - border.color: Material.hintTextColor - ToolTip.visible: maAutoColor.containsMouse - ToolTip.text: qsTr("Use automatic series color") - opacity: 0.85 - - Text { - anchors.centerIn: parent - text: qsTr("A") - font: apx.font_narrow(Math.max(10, parent.height * 0.55)) - color: Material.hintTextColor - } - MouseArea { - id: maAutoColor - anchors.fill: parent - hoverEnabled: true - onClicked: { - setAutoColor() - fact.menuBack() - } - } + function setAutoColor() { + if (title !== qsTr("Auto")) + return; + var f = parentFact + if (!f) + return; + if(f.colorsCount <= 0) { + f.value = "#ffffff" + return; } - - Label { - text: "Auto color selection" - font.pixelSize: Style.fontSize * 0.7 - anchors.verticalCenter: parent.verticalCenter + var index = 0 + if(!f.parentFact.newItem) { + index = f.parentFact.num % f.colorsCount + 1 + console.log(index) } + else + index = f.chartsCount + f.value = f.child(num + index).colorValue } - - // RowLayout { - // id: colorPreview - // anchors.bottom: parent.bottom - // spacing: space - - // Rectangle { - // color: "transparent" - // width: 40 * ui.scale - // height: 24 * ui.scale - // radius: height / 5 - // border.width: ui.scale - // // border.color: "#383838" - // border.color: Material.hintTextColor - // Layout.topMargin: space - // Layout.leftMargin: space - // opacity: 0.85 - - // Text { - // anchors.centerIn: parent - // text: qsTr("A") - // font: apx.font_narrow(Math.max(10, parent.height * 0.55)) - // color: Material.hintTextColor - // } - // } - - // Label { - // text: fact.value != "Auto" ? colorChooser.color : "Auto" - // font.pixelSize: Style.fontSize * 0.7 - // Layout.topMargin: space - // Layout.alignment: Qt.AlignVCenter - // } - // } } + diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index 19a6d02cc..4c1e44b34 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -74,7 +74,7 @@ Fact { for (var i = 0; i < mChart.size; ++i) { var f = child(i); var s = f.text.trim(); - if (f.size != 0) { + if (f.size != 0 && f.name !== "color") { s = f.save(); } if (s === "") { diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml index 64a144c63..109282e3c 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml @@ -20,22 +20,101 @@ * along with this program. If not, see . */ import QtQuick +import QtQuick.Controls.Material import APX.Facts Fact { + id: mColor property bool changes: false + readonly property var colorBaseLabels: [ + qsTr("Red"), + qsTr("Pink"), + qsTr("Purple"), + qsTr("Deep Purple"), + qsTr("Indigo"), + qsTr("Blue"), + qsTr("Light Blue"), + qsTr("Cyan"), + qsTr("Teal"), + qsTr("Green"), + qsTr("Orange"), + qsTr("Blue Grey") + ] + readonly property var colorBaseValues: [ + Material.Red, + Material.Pink, + Material.Purple, + Material.DeepPurple, + Material.Indigo, + Material.Blue, + Material.LightBlue, + Material.Cyan, + Material.Teal, + Material.Green, + Material.Orange, + Material.BlueGrey + ] + readonly property var colorShadeLabels: [ + qsTr("300"), + qsTr("500"), + qsTr("700"), + qsTr("900") + ] + readonly property var colorShadeValues: [ + Material.Shade300, + Material.Shade500, + Material.Shade700, + Material.Shade900 + ] + readonly property var colorsCount: colorBaseValues.length * colorShadeValues.length + readonly property var chartsCount: mCharts.size + onValueChanged: updateDescr() onChangesChanged: { if (changes) mChart.changes = true;} Component.onCompleted: { if (!value || value === undefined) value = qsTr("Auto") - console.log("Component created", value) - - var opt = opts; - opt.page = "qrc:/FilteredCharts/SignalsColorChooser.qml"; - opts = opt; + rebuildColorChoices() + } + + function clearColorChoices() + { + if (!mColor) + return + for (var i = mColor.size - 1; i >= 0; --i) { + var child = mColor.child(i) + if (child) { + child.deleteFact() + } + } + } + + function rebuildColorChoices() + { + clearColorChoices(); + createFact(mColor, "SignalsColorChooser.qml", { + "title": qsTr("Auto"), + "descr": qsTr("Use automatic series color"), + "colorValue": "", + "section": "", + "value": qsTr("Auto") + }) + for (var i = 0; i < colorShadeValues.length; ++i) { + var shadeLabel = colorShadeLabels[i] + for (var j = 0; j < colorBaseValues.length; ++j) { + var colorCode = Material.color(colorBaseValues[j], + colorShadeValues[i]).toString().toUpperCase() + createFact(mColor, "SignalsColorChooser.qml", { + "title": colorBaseLabels[j], + "descr": colorCode, + "colorValue": colorCode, + "section": shadeLabel, + "value": colorCode + }) + } + } } function updateDescr() { From b6c95db67c7d39310a7145effdfa273e8a66f0ba Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 5 May 2026 18:01:26 +0300 Subject: [PATCH 117/163] Checked page saving refactored. --- src/Plugins/Tools/FilteredCharts/SignalsButton.qml | 4 +--- src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml | 9 +++++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml index 8c95abe69..ba8aa629e 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsButton.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsButton.qml @@ -47,10 +47,8 @@ TextButton { onCheckedChanged: { if (!pageFact) return; - if (checked) { + if (checked) sgMainChart.speedFactorValue = pageFact.speed; - autosaveTimer.restart(); - } pageFact.active = checked; } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 0f10b7cb9..6c1b8f1f9 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -48,7 +48,7 @@ Fact { } onActiveChanged: { if (active) - setFact.checked = num; + setFact.checked = num; } function addNewChart() { diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 781aded16..56e87453b 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -32,13 +32,14 @@ Fact { property bool changes: false property var pages //from config property var pinnedPages: [] - property var checked: 0 + property var checkedPage: 0 property var data: ({}) signal selected(var num) Component.onCompleted: load(data) Component.onDestruction: removed() // pinned menu closes when the plugin is closed + onCheckedPageChanged: if(active) sgMenu.saveSettings() function save() { changes = false; @@ -49,17 +50,17 @@ Fact { } var set = {}; set.title = mSetName.value; - set.checked = checked; + set.checked = checkedPage; set.pages = tmpPages; return set; } function load(set) { mSetName.value = set.title; - checked = set.checked; + checkedPage = set.checked; pages = set.pages; updateSetItems(); - setChecked(checked); + setChecked(checkedPage); changes = false; } From 6dc6c82df864d07f4d04321daced208da7983b06 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 5 May 2026 18:02:52 +0300 Subject: [PATCH 118/163] Menu page small fix. --- src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 6c1b8f1f9..b47ab3da6 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -48,7 +48,7 @@ Fact { } onActiveChanged: { if (active) - setFact.checked = num; + setFact.checkedPage = num; } function addNewChart() { From a6330f24393be8c700ab6d4762991a314104f8db Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 5 May 2026 18:22:39 +0300 Subject: [PATCH 119/163] Colors default settings simplified. --- .../FilteredCharts/SignalsColorChooser.qml | 16 ++---------- .../Tools/FilteredCharts/SignalsMenuChart.qml | 1 - .../Tools/FilteredCharts/SignalsMenuColor.qml | 26 ++++++++++++++++--- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml b/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml index ad4169f9e..8fa54de88 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml @@ -28,21 +28,9 @@ Fact { function setAutoColor() { if (title !== qsTr("Auto")) return; - var f = parentFact - if (!f) + if (!parentFact) return; - if(f.colorsCount <= 0) { - f.value = "#ffffff" - return; - } - var index = 0 - if(!f.parentFact.newItem) { - index = f.parentFact.num % f.colorsCount + 1 - console.log(index) - } - else - index = f.chartsCount - f.value = f.child(num + index).colorValue + parentFact.setDefaultColor() } } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index 4c1e44b34..e55a51251 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -31,7 +31,6 @@ Fact { precision: 2 icon: "rectangle" - property var chartsCount: mCharts.size property bool changes: false property bool newItem: false property bool warning: false diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml index 109282e3c..22c3268db 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml @@ -68,9 +68,7 @@ Fact { Material.Shade700, Material.Shade900 ] - readonly property var colorsCount: colorBaseValues.length * colorShadeValues.length - readonly property var chartsCount: mCharts.size - + onValueChanged: updateDescr() onChangesChanged: { if (changes) mChart.changes = true;} Component.onCompleted: { @@ -126,4 +124,26 @@ Fact { descr = qsTr("COLOR") + ": " + descrText.toString().toUpperCase(); changes = true; } + + function setDefaultColor() + { + // var index = 1 + // if(colorsCount <= 0) + // value = "#FFFFFF"; + // if(!mChart.newItem) + // index += mChart.num % colorsCount + // else + // index += mCharts.size + // value = mColor.child(index).colorValue + // console.log("color: ", value , "-", mColor.size) + var index = 0; + var colorsCount = colorBaseValues.length + if(colorsCount <= 0) + value = "#FFFFFF"; + if(!mChart.newItem) + index = mChart.num % colorsCount + else + index = mCharts.size % colorsCount + value = Material.color(colorBaseValues[index], colorShadeValues[0]).toString().toUpperCase(); + } } From bea7e0da356966ded4c8c7d9d6d4de593b9b30d5 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 5 May 2026 18:59:07 +0300 Subject: [PATCH 120/163] Color menu refactoring. --- src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml index 22c3268db..ce076d568 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml @@ -26,8 +26,8 @@ import APX.Facts Fact { id: mColor - property bool changes: false + property bool changes: false readonly property var colorBaseLabels: [ qsTr("Red"), qsTr("Pink"), @@ -127,15 +127,6 @@ Fact { function setDefaultColor() { - // var index = 1 - // if(colorsCount <= 0) - // value = "#FFFFFF"; - // if(!mChart.newItem) - // index += mChart.num % colorsCount - // else - // index += mCharts.size - // value = mColor.child(index).colorValue - // console.log("color: ", value , "-", mColor.size) var index = 0; var colorsCount = colorBaseValues.length if(colorsCount <= 0) From 0cd24620d74a989fa1ffacb5a49cd227d98cc7de Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 5 May 2026 21:31:38 +0300 Subject: [PATCH 121/163] Charts icon color changing added. --- .../FilteredCharts/SignalsColorEditor.qml | 15 ++----- .../Tools/FilteredCharts/SignalsMenu.qml | 2 +- .../Tools/FilteredCharts/SignalsMenuChart.qml | 12 ++++-- .../Tools/FilteredCharts/SignalsMenuColor.qml | 42 ++++++++++++------- 4 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsColorEditor.qml b/src/Plugins/Tools/FilteredCharts/SignalsColorEditor.qml index 8df19a639..fcf9af2ec 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsColorEditor.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsColorEditor.qml @@ -25,24 +25,15 @@ import QtQuick.Controls.Material Rectangle { id: editor - // readonly property string colorText: fact && fact.colorValue !== undefined - // ? String(fact.colorValue).trim().toUpperCase() - // : (fact && fact.itemOwner && fact.itemOwner.colorValue !== undefined - // ? String(fact.itemOwner.colorValue).trim().toUpperCase() - // : "") - // readonly property bool selected: fact && fact.itemOwner - // && fact.itemOwner.colorValue === colorText - - - readonly property string colorText: fact && fact.value !== undefined ? fact.value.trim().toUpperCase() : qsTr("Auto") - readonly property bool auto: colorText.toUpperCase() === "AUTO" + readonly property string colorText: fact && fact.value !== undefined ? fact.value.trim() : qsTr("Auto") + readonly property bool auto: colorText === qsTr("Auto") implicitHeight: factButton.height * 0.6 implicitWidth: factButton.height * 1.8 radius: height / 12 border.width: 2 border.color: Material.hintTextColor - color: !auto ? colorText : "transparent" + color: !auto ? colorText.toUpperCase() : "transparent" Text { anchors.centerIn: parent diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml index 584f6e0a8..200c46b92 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenu.qml @@ -162,7 +162,7 @@ Fact { json.active[name] = i; } application.prefs.saveFile(configs, JSON.stringify(json, ' ', 2)); - console.log("Signals settings saved"); + // console.log("Signals settings saved"); } function createFact(parent, url, opts) { diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index e55a51251..cc28002af 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -122,8 +122,6 @@ Fact { var f = child(i); if (!f.name) continue; - // if (f.name === "title") - // continue; if (f.text === "") continue; if (f.name === "color") @@ -140,14 +138,20 @@ Fact { function setColor() { var opt = mChart.opts; opt.color = mColor.text ? mColor.text : "#ffffff"; // Black color for chart turn into white - if (!newItem) - opt.iconColor = opt.color; mChart.opts = opt; + if (!newItem) + updateIconColor(opt.color) mColor.changes = false; pageFact.updateBtnValues(); sgMainChart.updateSeriesColor(); } + function updateIconColor(iconColor) { + var opt = mChart.opts; + opt.iconColor = iconColor; + mChart.opts = opt; + } + function updateValue() { try { var v = new Function('return ' + expr)(); diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml index ce076d568..b62951311 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml @@ -69,11 +69,13 @@ Fact { Material.Shade900 ] - onValueChanged: updateDescr() + onValueChanged: updateChartColor() onChangesChanged: { if (changes) mChart.changes = true;} Component.onCompleted: { if (!value || value === undefined) value = qsTr("Auto") + if(!mChart.newItem && value === qsTr("Auto")) + setDefaultColor() rebuildColorChoices() } @@ -115,6 +117,31 @@ Fact { } } + function setDefaultColor() + { + var colorsCount = colorBaseValues.length + if (colorsCount <= 0) { + value = "#FFFFFF"; + return; + } + var index = 0; + if (mCharts.size !== 0) { + if(mChart.num === 0) { + var f = mChart.parentFact + index = !(f && f.title === "Charts") ? mCharts.size % colorsCount : 0 + } else { + index = mChart.num % colorsCount + } + } + value = Material.color(colorBaseValues[index], colorShadeValues[0]).toString().toUpperCase(); + } + + function updateChartColor() { + if(!mChart.newItem) + mChart.updateIconColor(value) + updateDescr(); + } + function updateDescr() { var descrText = ""; if(!value || value === undefined) @@ -124,17 +151,4 @@ Fact { descr = qsTr("COLOR") + ": " + descrText.toString().toUpperCase(); changes = true; } - - function setDefaultColor() - { - var index = 0; - var colorsCount = colorBaseValues.length - if(colorsCount <= 0) - value = "#FFFFFF"; - if(!mChart.newItem) - index = mChart.num % colorsCount - else - index = mCharts.size % colorsCount - value = Material.color(colorBaseValues[index], colorShadeValues[0]).toString().toUpperCase(); - } } From cf5e2036c9199d90deb4061af8e051c6a535d14a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 6 May 2026 12:50:53 +0300 Subject: [PATCH 122/163] Pinned pages first init update. --- src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml | 2 +- src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml | 6 ++---- src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml | 1 + 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml b/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml index 8fa54de88..eb8440afb 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsColorChooser.qml @@ -18,7 +18,7 @@ Fact { function setColor() { if(!parentFact) return; - if(title === "Auto") { + if(title === qsTr("Auto")) { setAutoColor() return; } diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index b47ab3da6..1009a1a0e 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -50,6 +50,7 @@ Fact { if (active) setFact.checkedPage = num; } + onPinnedChanged: setFact.updatePinnedPages() function addNewChart() { mMenuChart.trigger(); @@ -201,10 +202,7 @@ Fact { descr: qsTr("Pin this page to the signals layout") flags: Fact.Bool icon: "pin" - onValueChanged: { - setFact.updatePinnedPages() - updateDescr(); - } + onValueChanged: updateDescr(); } Fact { id: mSpeed diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 56e87453b..306a44382 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -60,6 +60,7 @@ Fact { checkedPage = set.checked; pages = set.pages; updateSetItems(); + updatePinnedPages(); setChecked(checkedPage); changes = false; } From 907417ccff33f58d263b3b59a6f2df010b1b0192 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 6 May 2026 13:33:16 +0300 Subject: [PATCH 123/163] Max page limit added. --- src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml | 1 + src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml index b62951311..bf973cf4e 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuColor.qml @@ -28,6 +28,7 @@ Fact { id: mColor property bool changes: false + readonly property var colorBaseLabels: [ qsTr("Red"), qsTr("Pink"), diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml index 306a44382..975fcb873 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuSet.qml @@ -35,6 +35,8 @@ Fact { property var checkedPage: 0 property var data: ({}) + readonly property var pagesLimit: 10 + signal selected(var num) Component.onCompleted: load(data) @@ -169,6 +171,10 @@ Fact { icon: "plus-circle" newItem: true onAddTriggered: { + if (mPages.size >= pagesLimit) { + console.warn(qsTr("Maximum page limit reached")) + return; + } createPage(save()); if(mPages.size === 1) setChecked(0); } From 5495239aaefda66235018f025f6df1591bdae704 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 6 May 2026 15:17:32 +0300 Subject: [PATCH 124/163] Filters description update. --- .../SignalsFilterKalmanSimple.qml | 4 +-- .../SignalsFilterRunningAvg.qml | 2 +- .../Tools/FilteredCharts/SignalsMenuChart.qml | 2 +- .../FilteredCharts/SignalsMenuFilters.qml | 29 +++++++++++++++++-- .../Tools/FilteredCharts/SignalsMenuPage.qml | 6 ++-- 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml index a402f6afb..594bd8080 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterKalmanSimple.qml @@ -36,8 +36,8 @@ Fact { property var envCoef: 1 property var data: ({}) - onValueChanged: changes = true - onChangesChanged: {if (changes) fMenu.changes = true} + onValueChanged: fMenu.updateDescr() + onChangesChanged: changed(changes) Component.onCompleted: load(data) signal changed(bool changesValue) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml index 498b4ad94..802a80c37 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsFilterRunningAvg.qml @@ -35,7 +35,7 @@ Fact { property var data: ({}) property var coef: 1 - onValueChanged: changes = true; + onValueChanged: fMenu.updateDescr() onChangesChanged: changed(changes) Component.onCompleted: load(data) diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml index cc28002af..cfc0ae93f 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuChart.qml @@ -214,7 +214,7 @@ Fact { Fact { id: mFact - name: "binding" + // name: "binding" title: qsTr("Binding") descr: qsTr("Fact value") flags: Fact.Int diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml index 22f20e987..ddafd203b 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuFilters.qml @@ -109,6 +109,31 @@ Fact { fMenu.changes = changesValue; } + function updateDescr() { + var descrList = []; + var filtersCount = qsTr("Count").toUpperCase() + ": " + fSet.size; + descrList.push(filtersCount); + var filtersList = getUsedFiltersTitles(); + if (filtersList.length > 0) { + var filtersOn = qsTr("On").toUpperCase() + ": " + filtersList.join(", "); + descrList.push(filtersOn); + } + descr = descrList.join(", "); + changes = true; + } + + function getUsedFiltersTitles() { + var filtersList = []; + for(var i = 0; i < fSet.size; ++i) { + var f = fSet.child(i); + if(!f || !f.value) + continue; + if(f.value) + filtersList.push(f.title) + } + return filtersList; + } + // Using filters function useFilters(value, v) { for(var i = 0; i < fSet.size; ++i) { @@ -135,8 +160,8 @@ Fact { id: fSet title: qsTr("Filters") flags: (Fact.Group | Fact.Section | Fact.DragChildren) - onSizeChanged: changes = true - onItemMoved: changes = true + onSizeChanged: updateDescr(); + onItemMoved: updateDescr(); } // Actions diff --git a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml index 1009a1a0e..d67387901 100644 --- a/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml +++ b/src/Plugins/Tools/FilteredCharts/SignalsMenuPage.qml @@ -153,8 +153,8 @@ Fact { function updateDescr() { var descrList = []; if(mPinned.value) - descrList.push("PINNED") - var speedDescr = "SPEED: " + mSpeed.value; + descrList.push(qsTr("Pinned").toUpperCase()) + var speedDescr = qsTr("Speed").toUpperCase() + ": " + mSpeed.value; descrList.push(speedDescr); var descrCharts = []; for (var i = 0; i < mCharts.size; ++i) { @@ -166,7 +166,7 @@ Fact { } if (descrCharts.length > 0) { var chartsDescr = descrCharts.join(", "); - chartsDescr = "CHARTS: " + chartsDescr; + chartsDescr = qsTr("Charts").toUpperCase() + ": " + chartsDescr; descrList.push(chartsDescr); } descr = descrList.length > 0 ? descrList.join(", ") : ""; From 8ca4749112d87fbad8613e5cbc0bc9ba18e5606b Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 6 May 2026 16:11:40 +0300 Subject: [PATCH 125/163] Merge filtred charts and signals. --- src/Plugins/Tools/CMakeLists.txt | 1 - .../Tools/FilteredCharts/CMakeLists.txt | 3 - .../Tools/FilteredCharts/FilteredCharts.qml | 288 --------------- .../FilteredCharts/FilteredChartsPlugin.qml | 39 -- src/Plugins/Tools/FilteredCharts/README.md | 8 - src/Plugins/Tools/Signals/README.md | 2 +- src/Plugins/Tools/Signals/SignalButton.qml | 47 --- src/Plugins/Tools/Signals/Signals.qml | 341 +++++++++++------- .../SignalsButton.qml | 0 .../SignalsChartView.qml | 0 .../SignalsColorChooser.qml | 0 .../SignalsColorEditor.qml | 0 .../SignalsFilterChooser.qml | 0 .../SignalsFilterKalmanSimple.qml | 0 .../SignalsFilterRunningAvg.qml | 0 .../SignalsMenu.qml | 0 .../SignalsMenuChart.qml | 0 .../SignalsMenuColor.qml | 0 .../SignalsMenuFilters.qml | 0 .../SignalsMenuPage.qml | 0 .../SignalsMenuSet.qml | 0 src/Plugins/Tools/Signals/SignalsView.qml | 220 ----------- 22 files changed, 214 insertions(+), 735 deletions(-) delete mode 100644 src/Plugins/Tools/FilteredCharts/CMakeLists.txt delete mode 100644 src/Plugins/Tools/FilteredCharts/FilteredCharts.qml delete mode 100755 src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml delete mode 100644 src/Plugins/Tools/FilteredCharts/README.md delete mode 100644 src/Plugins/Tools/Signals/SignalButton.qml rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsButton.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsChartView.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsColorChooser.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsColorEditor.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsFilterChooser.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsFilterKalmanSimple.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsFilterRunningAvg.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsMenu.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsMenuChart.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsMenuColor.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsMenuFilters.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsMenuPage.qml (100%) rename src/Plugins/Tools/{FilteredCharts => Signals}/SignalsMenuSet.qml (100%) delete mode 100644 src/Plugins/Tools/Signals/SignalsView.qml diff --git a/src/Plugins/Tools/CMakeLists.txt b/src/Plugins/Tools/CMakeLists.txt index 967daa7e1..78c104a11 100644 --- a/src/Plugins/Tools/CMakeLists.txt +++ b/src/Plugins/Tools/CMakeLists.txt @@ -1,6 +1,5 @@ add_subdirectory("DatalinkInspector") add_subdirectory("VcpForwarding") -add_subdirectory("FilteredCharts") add_subdirectory("Signals") add_subdirectory("Ats") add_subdirectory("Swarm") diff --git a/src/Plugins/Tools/FilteredCharts/CMakeLists.txt b/src/Plugins/Tools/FilteredCharts/CMakeLists.txt deleted file mode 100644 index 8328020ed..000000000 --- a/src/Plugins/Tools/FilteredCharts/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -apx_plugin(SRCS "*.qml") - -apx_qrc(${MODULE} PREFIX ${MODULE} SRCS "*.qml") diff --git a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml b/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml deleted file mode 100644 index 1cb23a39d..000000000 --- a/src/Plugins/Tools/FilteredCharts/FilteredCharts.qml +++ /dev/null @@ -1,288 +0,0 @@ -/* - * APX Autopilot project - * - * Copyright (c) 2003-2020, Aliaksei Stratsilatau - * All rights reserved - * - * This file is part of APX Ground Control. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import QtQuick.Controls.Material -import QtCore - -import Apx.Common - -Rectangle { - id: sgControl - - implicitHeight: layout.implicitHeight - implicitWidth: Style.buttonSize * 15 - border.width: 0 - color: "#000" - - readonly property var pages: sgMenu.getActivePages() - readonly property var activeSet: sgMenu.getActiveSet() - readonly property var activePage: sgMenu.getActivePage() - readonly property var pinnedPages: activeSet ? activeSet.pinnedPages : [] - - Component.onCompleted: { - if (buttonGroup.buttons.length <= 0) - return; - if (buttonGroup.checkedButton == null) - buttonGroup.checkedButton = buttonGroup.buttons[0]; // check button #1 - } - - Connections { - target: apx.fleet.current.mandala - function onTelemetryDecoded() { - if (pages.length <= 0) - return; - for (var i = 0; i < pages.length; ++i) - pages[i].updateChartsValues(); - } - } - - function checkScrMatches(val) { - var matches = false; - for (var i = 0; i < buttonGroup.buttons.length; ++i) - if (buttonGroup.buttons[i].getScrMatches(val)) - matches = true; - return matches; - } - - function changeSpeed() { - if (!activePage) - return; - if (sgMainChart.speedFactorValue !== sgMainChart.speedFactor[sgMainChart.speedFactor.length - 1]) { - for (var i = 0; i < sgMainChart.speedFactor.length - 1; ++i) { - if (sgMainChart.speedFactor[i] <= sgMainChart.speedFactorValue && sgMainChart.speedFactorValue < sgMainChart.speedFactor[i + 1]) { - activePage.speed = sgMainChart.speedFactor[i + 1]; - break; - } - } - } else { - activePage.speed = sgMainChart.speedFactor[0]; - } - autosaveTimer.restart(); - } - - ColumnLayout { - id: layout - anchors.fill: parent - - Repeater { - model: sgControl.pinnedPages - - delegate: Item { - id: pinnedChartArea - - required property var modelData - required property int index - - property var pinnedPageFact: modelData - - Layout.fillWidth: true - Layout.preferredHeight: 110 * ui.scale - Layout.minimumHeight: 20 - - SignalsChartView { - id: sgPinnedChart - anchors.fill: parent - facts: pinnedPageFact ? pinnedPageFact.values : [] - speedFactorValue: pinnedPageFact ? pinnedPageFact.speed : 1 - } - - Rectangle { - anchors.top: parent.top - anchors.right: parent.right - anchors.margins: 4 * ui.scale - radius: 2 * ui.scale - visible: lblPinnedPage.text !== "" - color: maPinned.containsMouse ? "#50ffffff" : "#30ffffff" - implicitWidth: columnPinnedPage.implicitWidth + 10 * ui.scale - implicitHeight: columnPinnedPage.implicitHeight + 4 * ui.scale - - Column { - id: columnPinnedPage - anchors.centerIn: parent - Label { - id: lblPinnedPage - anchors.horizontalCenter: parent.horizontalCenter - text: pinnedPageFact ? pinnedPageFact.title : "" - font: apx.font_narrow(Style.fontSize * 0.8) - } - Label { - id: lblPinnedSpeed - anchors.right: parent.right - text: sgPinnedChart.speedFactorValue + "x" - font: apx.font_narrow(Style.fontSize * 0.8) - } - } - MouseArea { - id: maPinned - anchors.fill: parent - acceptedButtons: Qt.LeftButton - hoverEnabled: true - onClicked: changePinnedSpeed() - } - } - - function changePinnedSpeed() { - if (!pinnedPageFact) - return; - if (sgPinnedChart.speedFactorValue !== sgPinnedChart.speedFactor[sgPinnedChart.speedFactor.length - 1]) { - for (var i = 0; i < sgPinnedChart.speedFactor.length - 1; ++i) { - if (sgPinnedChart.speedFactor[i] <= sgPinnedChart.speedFactorValue && sgPinnedChart.speedFactorValue < sgPinnedChart.speedFactor[i + 1]) { - pinnedPageFact.speed = sgPinnedChart.speedFactor[i + 1]; - break; - } - } - } else { - pinnedPageFact.speed = sgMainChart.speedFactor[0]; - } - autosaveTimer.restart(); - } - } - } - - Item { - id: mainChartArea - Layout.fillWidth: true - Layout.fillHeight: true - Layout.minimumHeight: 20 - Layout.preferredHeight: 110 * ui.scale // 130 * ui.scale - clip: true - - SignalsChartView { - id: sgMainChart - anchors.fill: parent - facts: [] - } - Rectangle { - anchors.top: parent.top - anchors.right: parent.right - anchors.margins: 4 * ui.scale - radius: 2 * ui.scale - visible: lblMainPage.text !== "" - implicitWidth: columnMainPage.implicitWidth + 10 * ui.scale - implicitHeight: columnMainPage.implicitHeight + 4 * ui.scale - color: maMain.containsMouse ? "#50ffffff" : "#30ffffff" - opacity: 0.7 - - Column { - id: columnMainPage - anchors.centerIn: parent - Label { - id: lblMainPage - anchors.horizontalCenter: parent.horizontalCenter - text: sgControl.activePage ? sgControl.activePage.title : "" - font: apx.font_narrow(Style.fontSize * 0.8) - } - Label { - id: lblMainSpeed - anchors.right: parent.right - text: sgMainChart.speedFactorValue + "x" - font: apx.font_narrow(Style.fontSize * 0.8) - } - } - MouseArea { - id: maMain - anchors.fill: parent - acceptedButtons: Qt.LeftButton - hoverEnabled: true - onClicked: changeSpeed() - } - } - - Rectangle { - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.rightMargin: 4 * ui.scale - visible: lblMainSet.text !== "" - radius: ui.scale - color: "#30ffffff" - opacity: 0.7 - - implicitWidth: lblMainSet.implicitWidth + 10 * ui.scale - implicitHeight: lblMainSet.implicitHeight + 4 * ui.scale - - Label { - id: lblMainSet - anchors.centerIn: parent - text: sgControl.activeSet ? sgControl.activeSet.title : "" - font: apx.font_narrow(Style.fontSize * 0.8) - } - } - - Label { - anchors.centerIn: parent - visible: btnRepeater.count <= 0 - text: qsTr("No pages in the active set.") - font: apx.font_narrow(Style.fontSize * 0.8) - color: Material.secondaryTextColor - } - } - - ButtonGroup { - id: buttonGroup - } - - RowLayout { - id: bottomArea - Layout.fillWidth: true - Layout.margins: Style.spacing - spacing: 3 - Layout.maximumHeight: 24 * ui.scale - Repeater { - id: btnRepeater - model: sgControl.pages - - delegate: SignalsButton { - required property int index - required property var modelData - - property int pageIndex: index - - pageFact: modelData - } - } - IconButton { - iconName: "plus" - toolTip: qsTr("Edit chart configuration") - Layout.fillHeight: true - Layout.minimumWidth: height - onClicked: sgMenu.trigger() - } - } - } - - SignalsMenu { - id: sgMenu - } - - Timer { - id: autosaveTimer - interval: 1000 - onTriggered: sgMenu.saveSettings() - } - - Timer { - id: warnTimer - interval: 10000 - } -} diff --git a/src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml b/src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml deleted file mode 100755 index 2110e1919..000000000 --- a/src/Plugins/Tools/FilteredCharts/FilteredChartsPlugin.qml +++ /dev/null @@ -1,39 +0,0 @@ -/* - * APX Autopilot project - * - * Copyright (c) 2003-2020, Aliaksei Stratsilatau - * All rights reserved - * - * This file is part of APX Ground Control. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -import QtQuick - -import Apx.Common -import Apx.Application - -AppPlugin { - id: plugin - - title: qsTr("Filtered Charts") - descr: qsTr("Realtime filtered chart") - icon: "poll-box-outline" - - sourceComponent: FilteredCharts {} - uiComponent: "main" - onConfigure: { - ui.main.add(plugin, GroundControl.Layout.Main); - } -} diff --git a/src/Plugins/Tools/FilteredCharts/README.md b/src/Plugins/Tools/FilteredCharts/README.md deleted file mode 100644 index 91183c8a0..000000000 --- a/src/Plugins/Tools/FilteredCharts/README.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -page: plugins ---- - -# Filtered Charts - -QML widget to show live chart of selected UAV physical values with filtering. - \ No newline at end of file diff --git a/src/Plugins/Tools/Signals/README.md b/src/Plugins/Tools/Signals/README.md index fe4294aa8..293b94df2 100644 --- a/src/Plugins/Tools/Signals/README.md +++ b/src/Plugins/Tools/Signals/README.md @@ -4,4 +4,4 @@ page: plugins # Signals -QML widget to show live chart of defined UAV physical values for easy tuning. +QML widget to show live chart of selected UAV physical values with the ability to use filters for easy tuning и analysis. diff --git a/src/Plugins/Tools/Signals/SignalButton.qml b/src/Plugins/Tools/Signals/SignalButton.qml deleted file mode 100644 index 4985ed648..000000000 --- a/src/Plugins/Tools/Signals/SignalButton.qml +++ /dev/null @@ -1,47 +0,0 @@ -/* - * APX Autopilot project - * - * Copyright (c) 2003-2020, Aliaksei Stratsilatau - * All rights reserved - * - * This file is part of APX Ground Control. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -import QtQuick -import QtQuick.Controls -import QtQuick.Layouts - -import Apx.Common - -TextButton { - Layout.fillHeight: true - checkable: true - ButtonGroup.group: buttonGroup - - property var values: [] - onActivated: signals.facts=Qt.binding(function(){return values}) - - toolTip: getToolTip(values) - - function getToolTip(facts) - { - var s=[] - for(var i=0;i"+fact.descr+"") - } - return s.join("
") - } -} diff --git a/src/Plugins/Tools/Signals/Signals.qml b/src/Plugins/Tools/Signals/Signals.qml index b79e19bbb..1cb23a39d 100644 --- a/src/Plugins/Tools/Signals/Signals.qml +++ b/src/Plugins/Tools/Signals/Signals.qml @@ -27,88 +27,219 @@ import QtCore import Apx.Common - Rectangle { - id: control + id: sgControl implicitHeight: layout.implicitHeight - implicitWidth: layout.implicitWidth - + implicitWidth: Style.buttonSize * 15 border.width: 0 color: "#000" + readonly property var pages: sgMenu.getActivePages() + readonly property var activeSet: sgMenu.getActiveSet() + readonly property var activePage: sgMenu.getActivePage() + readonly property var pinnedPages: activeSet ? activeSet.pinnedPages : [] + + Component.onCompleted: { + if (buttonGroup.buttons.length <= 0) + return; + if (buttonGroup.checkedButton == null) + buttonGroup.checkedButton = buttonGroup.buttons[0]; // check button #1 + } + + Connections { + target: apx.fleet.current.mandala + function onTelemetryDecoded() { + if (pages.length <= 0) + return; + for (var i = 0; i < pages.length; ++i) + pages[i].updateChartsValues(); + } + } + + function checkScrMatches(val) { + var matches = false; + for (var i = 0; i < buttonGroup.buttons.length; ++i) + if (buttonGroup.buttons[i].getScrMatches(val)) + matches = true; + return matches; + } + + function changeSpeed() { + if (!activePage) + return; + if (sgMainChart.speedFactorValue !== sgMainChart.speedFactor[sgMainChart.speedFactor.length - 1]) { + for (var i = 0; i < sgMainChart.speedFactor.length - 1; ++i) { + if (sgMainChart.speedFactor[i] <= sgMainChart.speedFactorValue && sgMainChart.speedFactorValue < sgMainChart.speedFactor[i + 1]) { + activePage.speed = sgMainChart.speedFactor[i + 1]; + break; + } + } + } else { + activePage.speed = sgMainChart.speedFactor[0]; + } + autosaveTimer.restart(); + } + ColumnLayout { id: layout anchors.fill: parent - spacing: 0 - SignalsView { - id: signals - facts: [] - Layout.fillWidth: true - Layout.fillHeight: true - Layout.minimumHeight: 20 - Layout.preferredHeight: 130*ui.scale - } + Repeater { + model: sgControl.pinnedPages - TextInput { - id: textInput + delegate: Item { + id: pinnedChartArea - Layout.fillWidth: true - Layout.minimumHeight: Style.fontSize + required property var modelData + required property int index + + property var pinnedPageFact: modelData - // clip: true - // focus: true - visible: false + Layout.fillWidth: true + Layout.preferredHeight: 110 * ui.scale + Layout.minimumHeight: 20 - horizontalAlignment: Text.AlignRight - verticalAlignment: Text.AlignVCenter + SignalsChartView { + id: sgPinnedChart + anchors.fill: parent + facts: pinnedPageFact ? pinnedPageFact.values : [] + speedFactorValue: pinnedPageFact ? pinnedPageFact.speed : 1 + } - font: apx.font_narrow(Style.fontSize) + Rectangle { + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: 4 * ui.scale + radius: 2 * ui.scale + visible: lblPinnedPage.text !== "" + color: maPinned.containsMouse ? "#50ffffff" : "#30ffffff" + implicitWidth: columnPinnedPage.implicitWidth + 10 * ui.scale + implicitHeight: columnPinnedPage.implicitHeight + 4 * ui.scale - color: activeFocus?Material.color(Material.Yellow):Material.primaryTextColor - text: "est.air.airspeed" + Column { + id: columnPinnedPage + anchors.centerIn: parent + Label { + id: lblPinnedPage + anchors.horizontalCenter: parent.horizontalCenter + text: pinnedPageFact ? pinnedPageFact.title : "" + font: apx.font_narrow(Style.fontSize * 0.8) + } + Label { + id: lblPinnedSpeed + anchors.right: parent.right + text: sgPinnedChart.speedFactorValue + "x" + font: apx.font_narrow(Style.fontSize * 0.8) + } + } + MouseArea { + id: maPinned + anchors.fill: parent + acceptedButtons: Qt.LeftButton + hoverEnabled: true + onClicked: changePinnedSpeed() + } + } - activeFocusOnTab: true - selectByMouse: true + function changePinnedSpeed() { + if (!pinnedPageFact) + return; + if (sgPinnedChart.speedFactorValue !== sgPinnedChart.speedFactor[sgPinnedChart.speedFactor.length - 1]) { + for (var i = 0; i < sgPinnedChart.speedFactor.length - 1; ++i) { + if (sgPinnedChart.speedFactor[i] <= sgPinnedChart.speedFactorValue && sgPinnedChart.speedFactorValue < sgPinnedChart.speedFactor[i + 1]) { + pinnedPageFact.speed = sgPinnedChart.speedFactor[i + 1]; + break; + } + } + } else { + pinnedPageFact.speed = sgMainChart.speedFactor[0]; + } + autosaveTimer.restart(); + } + } + } + + Item { + id: mainChartArea + Layout.fillWidth: true + Layout.fillHeight: true + Layout.minimumHeight: 20 + Layout.preferredHeight: 110 * ui.scale // 130 * ui.scale + clip: true - onEditingFinished: { - updateFacts() + SignalsChartView { + id: sgMainChart + anchors.fill: parent + facts: [] } - onActiveFocusChanged: { - if(activeFocus)selectAll(); + Rectangle { + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: 4 * ui.scale + radius: 2 * ui.scale + visible: lblMainPage.text !== "" + implicitWidth: columnMainPage.implicitWidth + 10 * ui.scale + implicitHeight: columnMainPage.implicitHeight + 4 * ui.scale + color: maMain.containsMouse ? "#50ffffff" : "#30ffffff" + opacity: 0.7 + + Column { + id: columnMainPage + anchors.centerIn: parent + Label { + id: lblMainPage + anchors.horizontalCenter: parent.horizontalCenter + text: sgControl.activePage ? sgControl.activePage.title : "" + font: apx.font_narrow(Style.fontSize * 0.8) + } + Label { + id: lblMainSpeed + anchors.right: parent.right + text: sgMainChart.speedFactorValue + "x" + font: apx.font_narrow(Style.fontSize * 0.8) + } + } + MouseArea { + id: maMain + anchors.fill: parent + acceptedButtons: Qt.LeftButton + hoverEnabled: true + onClicked: changeSpeed() + } } - onVisibleChanged: if(visible)forceActiveFocus() - Component.onCompleted: updateFacts() - - property var facts: [] - function updateFacts() - { - var flist=[] - var list=textInput.text.split(',') - for(var i=0;i - * - * Copyright (c) 2003-2020, Aliaksei Stratsilatau - * All rights reserved - * - * This file is part of APX Ground Control. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -import QtQuick -import QtCharts -import QtQuick.Controls -import QtQml - -Item { - id: chartItem - //clip: true - property var facts: [] - - property bool openGL: false //apx.settings.graphics.opengl.value - property bool smoothLines: ui.smooth - - property real speed: 0 - property real lineWidth: ui.antialiasing ? 1.5 : 1 - property real lineWidthCmd: ui.antialiasing ? 2.1 : 2 - - property var speedFactor: [1, 2, 4, 0.5, 0.2] - property real speedFactorValue: speed < 0 ? speedFactor[0] : speed >= speedFactor.length ? speedFactor[speedFactor.length - 1] : speedFactor[speed] - - onFactsChanged: { - chartView.reset(); - } - - Connections { - target: apx.fleet.current.mandala - function onTelemetryDecoded() { - chartView.appendData(); - } - } - - ChartView { - id: chartView - - antialiasing: ui.antialiasing - legend.visible: false - margins.top: 0 - margins.left: 0 - margins.bottom: 0 - margins.right: 0 - - anchors.fill: parent - property int margin: -8 - anchors.topMargin: margin - anchors.bottomMargin: margin - anchors.leftMargin: margin - anchors.rightMargin: margin - //onPlotAreaChanged: margin=-plotArea.y/3 - - plotAreaColor: "black" - backgroundColor: "black" - backgroundRoundness: 0 - dropShadowEnabled: false - - property int samples: Math.min(1000, Math.max(25, width / (3 * speedFactorValue))) - property int time: 0 - - property bool dataExist: false - - ValueAxis { - id: axisX - property real t: chartView.time - Behavior on t { - enabled: ui.smooth && chartView.dataExist - NumberAnimation { - duration: 500 - } - } - min: t - chartView.samples + 20 - max: t - //min: -chartView.samples //t-chartView.samples+20 - //max: 0 //t - visible: false - gridVisible: false - labelsVisible: false - lineVisible: false - shadesVisible: false - titleVisible: false - } - ValueAxis { - id: axisY - min: -0 - max: 0 - tickCount: 4 - labelsColor: "white" - labelsFont.pixelSize: Qt.application.font.pixelSize * 0.7 - gridLineColor: "#555" - } - - property real dataPadding: 0.05 - property real dataPaddingZero: 0.05 - property var sdata: [] - property int timeRescale: 0 - - function reset() { - chartView.removeAllSeries(); - chartView.sdata = []; - chartView.time = 0; - axisY.min = -dataPaddingZero; - axisY.max = dataPaddingZero; - axisY.tickCount = 4; - axisY.applyNiceNumbers(); - speed = 0; - } - - function appendData() { - var t = time + 1; - for (var i = 0; i < facts.length; ++i) { - appendDataValue(facts[i], t, i); - } - //calc scale - reduce - if ((t - timeRescale) > 21) { - timeRescale = t; - var d = sdata.length - samples * facts.length; - if (d > 0) - sdata.splice(0, d); - var p = apx.seriesBounds(sdata); - var min = p.x - dataPadding; - var max = p.y + dataPadding; - if (min == max) { - min -= dataPaddingZero; - max += dataPaddingZero; - } - var bmod = false; - if (axisY.min < min) { - axisY.min = min; - bmod = true; - } - if (axisY.max > max) { - axisY.max = max; - bmod = true; - } - if (bmod) { - axisY.tickCount = 4; - axisY.applyNiceNumbers(); - } - } - time = t; - dataExist = true; - } - - function appendDataValue(fact, t, i) { - if (i >= chartView.count) - addFactSeries(fact); - var s = chartView.series(i); - - var value = fact.value != undefined ? fact.value : eval(fact.name); - - if (!isFinite(value)) - value = 0; - s.append(t, value); - sdata.push(value); - //instant rescale - grow - if (axisY.max < value) { - axisY.max = value + dataPadding; - } - if (axisY.min > value) { - axisY.min = value - dataPadding; - } - //remove old - var cnt = samples; - if (s.count > cnt) - s.removePoints(0, s.count - cnt); - } - - function addFactSeries(fact) { - var s = chartView.createSeries(ui.antialiasing ? ChartView.SeriesTypeLine : ChartView.SeriesTypeLine, fact.title, axisX, axisY); - s.useOpenGL = Qt.binding(function () { - return openGL; - }); - s.capStyle = Qt.RoundCap; - //s.opacity=0.7 - - var color = fact.opts.color; - if (!color) - color = Qt.rgba(1, 1, 1, 1); - - if (fact.name.startsWith("cmd")) { - s.width = Qt.binding(function () { - return lineWidthCmd; - }); - s.color = Qt.hsla(color.hslHue, color.hslSaturation / 2, color.hslLightness * 1.2, 1); - } else { - s.width = Qt.binding(function () { - return lineWidth; - }); - s.color = color; - } - return s; - } - } - - function changeSpeed() { - if ((speed + 1) < speedFactor.length) - speed++; - else - speed = 0; - } -} From 8a60792a703b7cf49ffcc2dc135434e06ae223c8 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 6 May 2026 18:08:14 +0300 Subject: [PATCH 126/163] Pinned pages refactored. Signals with charts realization (not finished). --- src/Plugins/Tools/Signals/Signals.qml | 2 +- src/Plugins/Tools/Signals/SignalsMenu.qml | 9 +++++++++ src/Plugins/Tools/Signals/SignalsMenuPage.qml | 1 - src/Plugins/Tools/Signals/SignalsMenuSet.qml | 12 +++++------- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Plugins/Tools/Signals/Signals.qml b/src/Plugins/Tools/Signals/Signals.qml index 1cb23a39d..4cb778d04 100644 --- a/src/Plugins/Tools/Signals/Signals.qml +++ b/src/Plugins/Tools/Signals/Signals.qml @@ -38,7 +38,7 @@ Rectangle { readonly property var pages: sgMenu.getActivePages() readonly property var activeSet: sgMenu.getActiveSet() readonly property var activePage: sgMenu.getActivePage() - readonly property var pinnedPages: activeSet ? activeSet.pinnedPages : [] + readonly property var pinnedPages: sgMenu.getPinnedPages() Component.onCompleted: { if (buttonGroup.buttons.length <= 0) diff --git a/src/Plugins/Tools/Signals/SignalsMenu.qml b/src/Plugins/Tools/Signals/SignalsMenu.qml index 200c46b92..9c40a5bd9 100644 --- a/src/Plugins/Tools/Signals/SignalsMenu.qml +++ b/src/Plugins/Tools/Signals/SignalsMenu.qml @@ -250,6 +250,15 @@ Fact { return activeSet.getActivePage(); } + function getPinnedPages() { + if (sgMenu.size <= 0) + return []; + var activeSet = getActiveSet(); + if (!activeSet) + return []; + return activeSet.getPinned(); + } + Fact { title: qsTr("Add set") flags: Fact.Action diff --git a/src/Plugins/Tools/Signals/SignalsMenuPage.qml b/src/Plugins/Tools/Signals/SignalsMenuPage.qml index d67387901..4d73f7f2b 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuPage.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuPage.qml @@ -50,7 +50,6 @@ Fact { if (active) setFact.checkedPage = num; } - onPinnedChanged: setFact.updatePinnedPages() function addNewChart() { mMenuChart.trigger(); diff --git a/src/Plugins/Tools/Signals/SignalsMenuSet.qml b/src/Plugins/Tools/Signals/SignalsMenuSet.qml index 975fcb873..239922eeb 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuSet.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuSet.qml @@ -31,7 +31,6 @@ Fact { property bool changes: false property var pages //from config - property var pinnedPages: [] property var checkedPage: 0 property var data: ({}) @@ -62,7 +61,6 @@ Fact { checkedPage = set.checked; pages = set.pages; updateSetItems(); - updatePinnedPages(); setChecked(checkedPage); changes = false; } @@ -113,16 +111,16 @@ Fact { changes = true; } - function updatePinnedPages() { - var pages = []; + function getPinned() { + var pinnedPages = []; for (var i = 0; i < mPages.size; ++i) { var f = mPages.child(i); if (!f) continue; - if (f.pinned) - pages.push(f); + if (f.pinned) + pinnedPages.push(f); } - pinnedPages = pages.length > 0 ? pages : []; + return pinnedPages.length > 0 ? pinnedPages : []; } function getPages() { From fa4b1d255ad3fd52181e01ee4ac04829891411e4 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 7 May 2026 15:24:01 +0300 Subject: [PATCH 127/163] Fonts size fix. --- src/Plugins/Tools/Signals/Signals.qml | 10 ++++++---- src/Plugins/Tools/Signals/SignalsChartView.qml | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Plugins/Tools/Signals/Signals.qml b/src/Plugins/Tools/Signals/Signals.qml index 4cb778d04..91bbe1ce4 100644 --- a/src/Plugins/Tools/Signals/Signals.qml +++ b/src/Plugins/Tools/Signals/Signals.qml @@ -85,6 +85,8 @@ Rectangle { id: layout anchors.fill: parent + property var chartLabelFont: apx.font_narrow(Style.fontSize * 0.8) + Repeater { model: sgControl.pinnedPages @@ -124,13 +126,13 @@ Rectangle { id: lblPinnedPage anchors.horizontalCenter: parent.horizontalCenter text: pinnedPageFact ? pinnedPageFact.title : "" - font: apx.font_narrow(Style.fontSize * 0.8) + font: layout.chartLabelFont } Label { id: lblPinnedSpeed anchors.right: parent.right text: sgPinnedChart.speedFactorValue + "x" - font: apx.font_narrow(Style.fontSize * 0.8) + font: layout.chartLabelFont } } MouseArea { @@ -191,13 +193,13 @@ Rectangle { id: lblMainPage anchors.horizontalCenter: parent.horizontalCenter text: sgControl.activePage ? sgControl.activePage.title : "" - font: apx.font_narrow(Style.fontSize * 0.8) + font: layout.chartLabelFont } Label { id: lblMainSpeed anchors.right: parent.right text: sgMainChart.speedFactorValue + "x" - font: apx.font_narrow(Style.fontSize * 0.8) + font: layout.chartLabelFont } } MouseArea { diff --git a/src/Plugins/Tools/Signals/SignalsChartView.qml b/src/Plugins/Tools/Signals/SignalsChartView.qml index bb60e5867..031ffa6b8 100644 --- a/src/Plugins/Tools/Signals/SignalsChartView.qml +++ b/src/Plugins/Tools/Signals/SignalsChartView.qml @@ -115,7 +115,7 @@ Item { max: 0 tickCount: 4 labelsColor: "white" - labelsFont: apx.font_narrow(Style.fontSize * 0.7) + labelsFont: apx.font_narrow(Style.fontSize * 0.65) gridLineColor: "#555" } From 1885b453a38bc5b926676da75dad6f570f53d8c1 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 8 May 2026 01:19:44 +0300 Subject: [PATCH 128/163] Colors facts updated. --- src/Plugins/Tools/Signals/SignalsColorChooser.qml | 5 +++-- src/Plugins/Tools/Signals/SignalsColorEditor.qml | 5 +++-- src/Plugins/Tools/Signals/SignalsMenuColor.qml | 13 +++++++------ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsColorChooser.qml b/src/Plugins/Tools/Signals/SignalsColorChooser.qml index eb8440afb..1abb3efcb 100644 --- a/src/Plugins/Tools/Signals/SignalsColorChooser.qml +++ b/src/Plugins/Tools/Signals/SignalsColorChooser.qml @@ -6,6 +6,7 @@ import APX.Facts Fact { id: colorFact + property string colorAuto: parentFact ? parentFact.colorAuto : "#E57373" property string colorValue: "" flags: Fact.CloseOnTrigger @@ -18,7 +19,7 @@ Fact { function setColor() { if(!parentFact) return; - if(title === qsTr("Auto")) { + if(title === colorAuto) { setAutoColor() return; } @@ -26,7 +27,7 @@ Fact { } function setAutoColor() { - if (title !== qsTr("Auto")) + if (title !== colorAuto) return; if (!parentFact) return; diff --git a/src/Plugins/Tools/Signals/SignalsColorEditor.qml b/src/Plugins/Tools/Signals/SignalsColorEditor.qml index fcf9af2ec..6c7638ef3 100644 --- a/src/Plugins/Tools/Signals/SignalsColorEditor.qml +++ b/src/Plugins/Tools/Signals/SignalsColorEditor.qml @@ -25,8 +25,9 @@ import QtQuick.Controls.Material Rectangle { id: editor - readonly property string colorText: fact && fact.value !== undefined ? fact.value.trim() : qsTr("Auto") - readonly property bool auto: colorText === qsTr("Auto") + readonly property string colorAuto: qsTr("Auto") + readonly property string colorText: fact && fact.value !== undefined ? fact.value.trim() : colorAuto + readonly property bool auto: colorText === colorAuto implicitHeight: factButton.height * 0.6 implicitWidth: factButton.height * 1.8 diff --git a/src/Plugins/Tools/Signals/SignalsMenuColor.qml b/src/Plugins/Tools/Signals/SignalsMenuColor.qml index bf973cf4e..ea491f04c 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuColor.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuColor.qml @@ -27,6 +27,7 @@ import APX.Facts Fact { id: mColor + readonly property var colorAuto: qsTr("Auto") property bool changes: false readonly property var colorBaseLabels: [ @@ -74,8 +75,8 @@ Fact { onChangesChanged: { if (changes) mChart.changes = true;} Component.onCompleted: { if (!value || value === undefined) - value = qsTr("Auto") - if(!mChart.newItem && value === qsTr("Auto")) + value = colorAuto + if(!mChart.newItem && value === colorAuto) setDefaultColor() rebuildColorChoices() } @@ -96,11 +97,11 @@ Fact { { clearColorChoices(); createFact(mColor, "SignalsColorChooser.qml", { - "title": qsTr("Auto"), + "title": colorAuto, "descr": qsTr("Use automatic series color"), "colorValue": "", "section": "", - "value": qsTr("Auto") + "value": colorAuto }) for (var i = 0; i < colorShadeValues.length; ++i) { var shadeLabel = colorShadeLabels[i] @@ -146,10 +147,10 @@ Fact { function updateDescr() { var descrText = ""; if(!value || value === undefined) - descrText = qsTr("Auto") + descrText = colorAuto else descrText = value - descr = qsTr("COLOR") + ": " + descrText.toString().toUpperCase(); + descr = qsTr("Color").toUpperCase() + ": " + descrText.toString().toUpperCase(); changes = true; } } From 9398abcbb80b5f7703082deb71f5355f38561097 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 8 May 2026 01:29:56 +0300 Subject: [PATCH 129/163] Warning small fix. --- src/Plugins/Tools/Signals/SignalsMenuChart.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Plugins/Tools/Signals/SignalsMenuChart.qml b/src/Plugins/Tools/Signals/SignalsMenuChart.qml index cfc0ae93f..cdb169473 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuChart.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuChart.qml @@ -172,8 +172,10 @@ Fact { function updateWarning () { try { - if(exprW === "") + if(exprW.trim() === "") { + warning = false; return; + } var v = new Function('return ' + exprW)(); if (v === undefined) throw new Error(qsTr("expression is undefined")); From 04824d2e0dba7b33c22d76f530b0e7f5b94a3579 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 8 May 2026 03:13:24 +0300 Subject: [PATCH 130/163] Charts when all pages deleted fix. --- src/Plugins/Tools/Signals/Signals.qml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Plugins/Tools/Signals/Signals.qml b/src/Plugins/Tools/Signals/Signals.qml index 91bbe1ce4..f23981711 100644 --- a/src/Plugins/Tools/Signals/Signals.qml +++ b/src/Plugins/Tools/Signals/Signals.qml @@ -234,14 +234,24 @@ Rectangle { Label { anchors.centerIn: parent visible: btnRepeater.count <= 0 - text: qsTr("No pages in the active set.") + text: qsTr("No pages in the active set") font: apx.font_narrow(Style.fontSize * 0.8) color: Material.secondaryTextColor + background: Rectangle { + color: sgControl.color + } } } ButtonGroup { id: buttonGroup + + onCheckedButtonChanged: { + if (checkedButton) + return; + sgMainChart.resetEnable = true; + sgMainChart.facts = [] + } } RowLayout { From 547e021a10925fa52c9bdde0d148b788f0e574cb Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 8 May 2026 17:27:59 +0300 Subject: [PATCH 131/163] Filters fact updated. Page updated. --- .../Signals/SignalsFilterKalmanSimple.qml | 2 +- .../Tools/Signals/SignalsFilterRunningAvg.qml | 2 +- .../Tools/Signals/SignalsMenuChart.qml | 28 +++++++++++-------- .../Tools/Signals/SignalsMenuFilters.qml | 17 +++++------ src/Plugins/Tools/Signals/SignalsMenuPage.qml | 14 ++++++---- 5 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsFilterKalmanSimple.qml b/src/Plugins/Tools/Signals/SignalsFilterKalmanSimple.qml index 594bd8080..99246bf57 100644 --- a/src/Plugins/Tools/Signals/SignalsFilterKalmanSimple.qml +++ b/src/Plugins/Tools/Signals/SignalsFilterKalmanSimple.qml @@ -77,7 +77,7 @@ Fact { } function updateDescr() { - descr = qsTr("COEF") + ": " + "Km=" + ksMeasNoise.value + ", Ke=" + ksEnvNoise.value; + descr = qsTr("Coef").toUpperCase() + ": " + "Km=" + ksMeasNoise.value + ", Ke=" + ksEnvNoise.value; changes = true; } diff --git a/src/Plugins/Tools/Signals/SignalsFilterRunningAvg.qml b/src/Plugins/Tools/Signals/SignalsFilterRunningAvg.qml index 802a80c37..1cdf7c910 100644 --- a/src/Plugins/Tools/Signals/SignalsFilterRunningAvg.qml +++ b/src/Plugins/Tools/Signals/SignalsFilterRunningAvg.qml @@ -76,7 +76,7 @@ Fact { } function updateDescr() { - descr = qsTr("COEF") + ": K=" + raCoef.value + descr = qsTr("Coef").toUpperCase() + ": K=" + raCoef.value changes = true; } diff --git a/src/Plugins/Tools/Signals/SignalsMenuChart.qml b/src/Plugins/Tools/Signals/SignalsMenuChart.qml index cdb169473..57b529201 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuChart.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuChart.qml @@ -52,12 +52,13 @@ Fact { mBind.valueChanged.connect(updateTitle); mBind.valueChanged.connect(updateDescr); mColor.valueChanged.connect(updateDescr); - mFilters.valueChanged.connect(updateDescr); + mFilters.descrChanged.connect(updateDescr); + mWarn.textChanged.connect(updateDescr); mFact2Save.valueChanged.connect(updateDescr); } onValueChanged: saveValue2Fact() - onChangesChanged: {if (changes) pageFact.changes = true} + onChangesChanged: {if (changes && !newItem) pageFact.changes = true} function load(data) { for (var i = 0; i < mChart.size; ++i) { @@ -124,10 +125,16 @@ Fact { continue; if (f.text === "") continue; - if (f.name === "color") - descrList.push(f.name.toUpperCase() + ": " + f.text.toUpperCase()); - else + if (f.name === "filt") { + var usedFilters = f.getUsedFilterNames(); + if (usedFilters.length > 0) { + descrList.push(f.name.toUpperCase() + ": " + f.getUsedFilterNames().join(", ")); + } + } else if (f.name === "color") { + descrList.push(f.name.toUpperCase() + ": " + f.text.toUpperCase()); + } else { descrList.push(f.name.toUpperCase() + ": " + f.text); + } } if (descrList.length > 0) descr = descrList.join(", "); @@ -216,15 +223,11 @@ Fact { Fact { id: mFact - // name: "binding" title: qsTr("Binding") descr: qsTr("Fact value") flags: Fact.Int units: "mandala" - onTextChanged: { - if (value) - mBind.setValue(text); - } + onTextChanged: if (value) mBind.setValue(text) } Fact { id: mBind @@ -232,7 +235,7 @@ Fact { title: qsTr("Expression") descr: "Math.atan(est.att.pitch/est.att.roll)" flags: Fact.Text - onTextChanged: changes = true + onTextChanged: changes = true; } SignalsMenuColor { id: mColor @@ -249,6 +252,7 @@ Fact { name: "filt" title: qsTr("Filters") descr: qsTr("Filters settings") + onDescrChanged: changes = true } Fact { id: mWarn @@ -256,7 +260,7 @@ Fact { title: qsTr("Warning") descr: qsTr("Expression for warning") flags: Fact.Text - onTextChanged: changes = true + onTextChanged: changes = true; } Fact { id: mFact2Save diff --git a/src/Plugins/Tools/Signals/SignalsMenuFilters.qml b/src/Plugins/Tools/Signals/SignalsMenuFilters.qml index ddafd203b..e6b026c76 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuFilters.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuFilters.qml @@ -111,9 +111,7 @@ Fact { function updateDescr() { var descrList = []; - var filtersCount = qsTr("Count").toUpperCase() + ": " + fSet.size; - descrList.push(filtersCount); - var filtersList = getUsedFiltersTitles(); + var filtersList = getUsedFilterNames(); if (filtersList.length > 0) { var filtersOn = qsTr("On").toUpperCase() + ": " + filtersList.join(", "); descrList.push(filtersOn); @@ -122,14 +120,14 @@ Fact { changes = true; } - function getUsedFiltersTitles() { + function getUsedFilterNames() { var filtersList = []; for(var i = 0; i < fSet.size; ++i) { var f = fSet.child(i); - if(!f || !f.value) + if(!f || !f.value) continue; - if(f.value) - filtersList.push(f.title) + var shortName = f.filterType.replace(/(?:_| |\b)(\w)/g, (match, c1) => c1.toUpperCase()); + filtersList.push(shortName); } return filtersList; } @@ -160,8 +158,11 @@ Fact { id: fSet title: qsTr("Filters") flags: (Fact.Group | Fact.Section | Fact.DragChildren) - onSizeChanged: updateDescr(); onItemMoved: updateDescr(); + onSizeChanged: { + fMenu.value = size > 0 ? size : "" + updateDescr(); + } } // Actions diff --git a/src/Plugins/Tools/Signals/SignalsMenuPage.qml b/src/Plugins/Tools/Signals/SignalsMenuPage.qml index 4d73f7f2b..c9ca2a6a0 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuPage.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuPage.qml @@ -45,6 +45,10 @@ Fact { load(data); updateTitle(); updateDescr(); + mPageName.textChanged.connect(updateTitle); + mPinned.valueChanged.connect(updateDescr); + mSpeed.valueChanged.connect(updateDescr); + mCharts.sizeChanged.connect(updateDescr); } onActiveChanged: { if (active) @@ -146,7 +150,6 @@ Fact { return; var text = mPageName.text.trim(); title = text != "" ? text : qsTr("P") + (Math.max(pageFact.num, 0) + 1); - changes = true; } function updateDescr() { @@ -169,7 +172,6 @@ Fact { descrList.push(chartsDescr); } descr = descrList.length > 0 ? descrList.join(", ") : ""; - changes = true; } function updateToolTip() { @@ -193,7 +195,7 @@ Fact { descr: qsTr("Charts page name") flags: Fact.Text icon: "rename-box" - onTextChanged: updateTitle() + onTextChanged: changes = true; } Fact { id: mPinned @@ -201,7 +203,7 @@ Fact { descr: qsTr("Pin this page to the signals layout") flags: Fact.Bool icon: "pin" - onValueChanged: updateDescr(); + onValueChanged: changes = true; } Fact { id: mSpeed @@ -216,7 +218,7 @@ Fact { onValueChanged: { if (active && setFact.active) sgMainChart.speedFactorValue = value; - updateDescr(); + changes = true; } } SignalsMenuChart { @@ -233,8 +235,8 @@ Fact { title: qsTr("Charts") flags: (Fact.Group | Fact.Section | Fact.DragChildren) onSizeChanged: { - updateDescr(); sgMainChart.resetEnable = true; + changes = true; } } From cbeb1925ba730609ff94129927584495f7129da5 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 8 May 2026 19:07:14 +0300 Subject: [PATCH 132/163] Update chart color refactoring. --- src/Plugins/Tools/Signals/SignalsChartView.qml | 17 ++++++----------- src/Plugins/Tools/Signals/SignalsMenuChart.qml | 1 - 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsChartView.qml b/src/Plugins/Tools/Signals/SignalsChartView.qml index 031ffa6b8..af50d5495 100644 --- a/src/Plugins/Tools/Signals/SignalsChartView.qml +++ b/src/Plugins/Tools/Signals/SignalsChartView.qml @@ -54,17 +54,6 @@ Item { } } - function updateSeriesColor() { - for (var i = 0; i < facts.length; ++i) { - if (!chartView.series(i)) - continue; - if (!facts || !facts[i] || !facts[i].opts) - continue; - if (chartView.series(i).color != facts[i].opts.color) - chartView.series(i).color = facts[i].opts.color; - } - } - ChartView { id: chartView @@ -192,6 +181,12 @@ Item { var cnt = samples; if (s.count > cnt) s.removePoints(0, s.count - cnt); + // Check color + var color = fact.opts.color; + if(!color) + return; + if(s.color !== color) + s.color = color } function addFactSeries(fact) { diff --git a/src/Plugins/Tools/Signals/SignalsMenuChart.qml b/src/Plugins/Tools/Signals/SignalsMenuChart.qml index 57b529201..0db3632f9 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuChart.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuChart.qml @@ -150,7 +150,6 @@ Fact { updateIconColor(opt.color) mColor.changes = false; pageFact.updateBtnValues(); - sgMainChart.updateSeriesColor(); } function updateIconColor(iconColor) { From ef07e6963f39746d3c86b236c51d4c1e139af6c0 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Fri, 8 May 2026 19:32:01 +0300 Subject: [PATCH 133/163] Warning fix. --- .../Tools/Signals/SignalsMenuChart.qml | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsMenuChart.qml b/src/Plugins/Tools/Signals/SignalsMenuChart.qml index 0db3632f9..e487e4403 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuChart.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuChart.qml @@ -40,7 +40,7 @@ Fact { // Chart values property var type: "none" property var expr: "" - property var exprW: "" + property var exprWarn: "" property var scr: "" signal addTriggered @@ -95,7 +95,7 @@ Fact { function updateChartVars() { expr = mBind.text; - exprW = mWarn.text; + exprWarn = mWarn.text; type = mFilters.value; scr = mFact2Save.text; if (type === "kalman_smp") { @@ -177,19 +177,15 @@ Fact { } function updateWarning () { + if (!exprWarn || String(exprWarn).trim() === "") { + warning = false; + return; + } try { - if(exprW.trim() === "") { - warning = false; - return; - } - var v = new Function('return ' + exprW)(); - if (v === undefined) - throw new Error(qsTr("expression is undefined")); - if(typeof v !== 'boolean') - throw new Error(qsTr("wrong warning condition (not true/false)")); - warning = v; - } catch (e) { - chartWarning(e.message); + warning = !!eval(exprWarn) + } catch (error) { + chartWarning(error.message) + warning = false; } } @@ -257,7 +253,7 @@ Fact { id: mWarn name: "warn" title: qsTr("Warning") - descr: qsTr("Expression for warning") + descr: qsTr("Expression for warning") + "(value>1.5 || value <0)" flags: Fact.Text onTextChanged: changes = true; } From 4d8fec5c5a694edb155ecdee50c18b24dfe76000 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 11 May 2026 10:58:47 +0300 Subject: [PATCH 134/163] Empty signals menu when plugin closed fix. --- src/Plugins/Tools/Signals/SignalsMenu.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Plugins/Tools/Signals/SignalsMenu.qml b/src/Plugins/Tools/Signals/SignalsMenu.qml index 9c40a5bd9..ede52380b 100644 --- a/src/Plugins/Tools/Signals/SignalsMenu.qml +++ b/src/Plugins/Tools/Signals/SignalsMenu.qml @@ -36,6 +36,7 @@ Fact { icon: "gauge" Component.onCompleted: loadSettings() + Component.onDestruction: removed() function getCharts() { var charts = []; From 2bbdbdbc4ca441322e7ff639d6f9d148adb6735c Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 11 May 2026 13:28:09 +0300 Subject: [PATCH 135/163] Scripts to save check refactoring. --- src/Plugins/Tools/Signals/SignalsButton.qml | 4 ---- src/Plugins/Tools/Signals/SignalsMenuChart.qml | 7 +++++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsButton.qml b/src/Plugins/Tools/Signals/SignalsButton.qml index ba8aa629e..3d3096379 100644 --- a/src/Plugins/Tools/Signals/SignalsButton.qml +++ b/src/Plugins/Tools/Signals/SignalsButton.qml @@ -77,8 +77,4 @@ TextButton { function getDefaultText() { return "#" + buttonGroup.buttons.indexOf(this); } - - function getScrMatches(val) { - return sgMenuPage.checkScrs(val); - } } diff --git a/src/Plugins/Tools/Signals/SignalsMenuChart.qml b/src/Plugins/Tools/Signals/SignalsMenuChart.qml index e487e4403..42bc4d80e 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuChart.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuChart.qml @@ -202,6 +202,12 @@ Fact { apx.fleet.current.mandala.fact(fname, true).setRawValueLocal(value); } + function checkFact2SaveName(fname) { + if (fname.trim() === "" || fname.includes("sns.scr")) + return; + console.warn(qsTr("Chart") + " " + mBind.text + ": " + qsTr("Unacceptable variable name. Use 'sns.scr' vars for saving!")); + } + function chartWarning(msg) { if (warningMsg == msg && warnTimer.running) return; @@ -265,6 +271,7 @@ Fact { flags: Fact.Int units: "mandala" onTextChanged: { + checkFact2SaveName(text); setFact.checkScrMatches(text); changes = true; } From 3644e431fdb823343348adeb4c64fc98a7a15fa3 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 11 May 2026 13:28:32 +0300 Subject: [PATCH 136/163] Readme refactoring. --- src/Plugins/Tools/Signals/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/Tools/Signals/README.md b/src/Plugins/Tools/Signals/README.md index 293b94df2..86c6e2792 100644 --- a/src/Plugins/Tools/Signals/README.md +++ b/src/Plugins/Tools/Signals/README.md @@ -4,4 +4,4 @@ page: plugins # Signals -QML widget to show live chart of selected UAV physical values with the ability to use filters for easy tuning и analysis. +QML widget to show live chart of selected UAV physical values with the ability to use filters for easy tuning and analysis. From d0982334832bc6bbfa8b80a3ebd892f5c8667b27 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 11 May 2026 13:50:58 +0300 Subject: [PATCH 137/163] Remove active set fixed. --- src/Plugins/Tools/Signals/SignalsMenuSet.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/Tools/Signals/SignalsMenuSet.qml b/src/Plugins/Tools/Signals/SignalsMenuSet.qml index 239922eeb..16bb9b7af 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuSet.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuSet.qml @@ -207,7 +207,7 @@ Fact { title: qsTr("Remove") icon: "delete" onTriggered: { - if (setFact.active) select(0); + if (setFact.active) setFact.selected(0); setFact.deleteFact(); } } From 6ab53e736996235824d04b8bb778d800ac786511 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 11 May 2026 14:12:26 +0300 Subject: [PATCH 138/163] Default pages values fixed. --- src/Plugins/Tools/Signals/SignalsMenuSet.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/Tools/Signals/SignalsMenuSet.qml b/src/Plugins/Tools/Signals/SignalsMenuSet.qml index 16bb9b7af..c77752523 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuSet.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuSet.qml @@ -30,7 +30,7 @@ Fact { title: "Set" property bool changes: false - property var pages //from config + property var pages: [] //from config property var checkedPage: 0 property var data: ({}) From 961592e44f1838e769cd5168cc5c13dc4fa89588 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 11 May 2026 14:16:24 +0300 Subject: [PATCH 139/163] Update page refactoring. --- src/Plugins/Tools/Signals/SignalsMenuPage.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsMenuPage.qml b/src/Plugins/Tools/Signals/SignalsMenuPage.qml index c9ca2a6a0..481573c8e 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuPage.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuPage.qml @@ -34,7 +34,7 @@ Fact { property string pageToolTip: "" property alias speed: mSpeed.value property alias pinned: mPinned.value - property var charts //from config + property var charts: [] //from config property var values: [] property var data: ({}) @@ -107,11 +107,11 @@ Fact { mSpeed.value = page.speed ? page.speed : 1; mPinned.value = page.pinned; charts = page.charts; - updateSetItems(); + updatePageItems(); changes = false; } - function updateSetItems() { + function updatePageItems() { mCharts.deleteChildren(); for (var i in charts) { createChart(charts[i]); From a5c70d7966a1096af8e67f7687ceae5a23c1c08b Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 11 May 2026 14:38:49 +0300 Subject: [PATCH 140/163] Signals menu fixed. --- src/Plugins/Tools/Signals/SignalsMenu.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Plugins/Tools/Signals/SignalsMenu.qml b/src/Plugins/Tools/Signals/SignalsMenu.qml index ede52380b..d3e246e0c 100644 --- a/src/Plugins/Tools/Signals/SignalsMenu.qml +++ b/src/Plugins/Tools/Signals/SignalsMenu.qml @@ -186,6 +186,8 @@ Fact { var set = {}; set.title = "Set" + (sgMenu.size + 1); set.values = []; + set.pages = []; + set.checked = 0; var c = createFact(sgMenu, "SignalsMenuSet.qml", { "data": set }); From 60f0b5b56a803121863b0ae1846ce64bcbddee6a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 11 May 2026 14:48:14 +0300 Subject: [PATCH 141/163] Filters menu fixed. --- src/Plugins/Tools/Signals/SignalsMenuFilters.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/Tools/Signals/SignalsMenuFilters.qml b/src/Plugins/Tools/Signals/SignalsMenuFilters.qml index e6b026c76..f1ad371e6 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuFilters.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuFilters.qml @@ -44,7 +44,7 @@ Fact { for (var i in filters) { createFilter(filters[i]); } - updateBtnValues(); + pageFact.updateBtnValues(); changes = false; } From 46c2fdf8f66439a7fc3645b0a8ee14da329871e6 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 11 May 2026 14:54:47 +0300 Subject: [PATCH 142/163] Color menu updated and fixed. --- src/Plugins/Tools/Signals/SignalsMenuColor.qml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Plugins/Tools/Signals/SignalsMenuColor.qml b/src/Plugins/Tools/Signals/SignalsMenuColor.qml index ea491f04c..8564b5627 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuColor.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuColor.qml @@ -119,6 +119,15 @@ Fact { } } + function createFact(parent, url, opts) { + var component = Qt.createComponent(url); + if (component.status === Component.Ready) { + var c = component.createObject(parent, opts); + c.parentFact = parent; + return c; + } + } + function setDefaultColor() { var colorsCount = colorBaseValues.length From 05ab77f1c03d7850af1169366ad6b84b402a2117 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 11 May 2026 18:58:25 +0300 Subject: [PATCH 143/163] MainChart reset update. Chart color warning fix. --- src/Plugins/Tools/Signals/Signals.qml | 2 +- src/Plugins/Tools/Signals/SignalsChartView.qml | 4 ++-- src/Plugins/Tools/Signals/SignalsMenuPage.qml | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Plugins/Tools/Signals/Signals.qml b/src/Plugins/Tools/Signals/Signals.qml index f23981711..0dabe044d 100644 --- a/src/Plugins/Tools/Signals/Signals.qml +++ b/src/Plugins/Tools/Signals/Signals.qml @@ -155,7 +155,7 @@ Rectangle { } } } else { - pinnedPageFact.speed = sgMainChart.speedFactor[0]; + pinnedPageFact.speed = sgPinnedChart.speedFactor[0]; } autosaveTimer.restart(); } diff --git a/src/Plugins/Tools/Signals/SignalsChartView.qml b/src/Plugins/Tools/Signals/SignalsChartView.qml index af50d5495..5b2b3b87c 100644 --- a/src/Plugins/Tools/Signals/SignalsChartView.qml +++ b/src/Plugins/Tools/Signals/SignalsChartView.qml @@ -182,8 +182,8 @@ Item { if (s.count > cnt) s.removePoints(0, s.count - cnt); // Check color - var color = fact.opts.color; - if(!color) + var color = fact.opts!== undefined ? fact.opts.color : undefined + if(!color || color === undefined) return; if(s.color !== color) s.color = color diff --git a/src/Plugins/Tools/Signals/SignalsMenuPage.qml b/src/Plugins/Tools/Signals/SignalsMenuPage.qml index 481573c8e..8d7a38f3f 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuPage.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuPage.qml @@ -235,7 +235,8 @@ Fact { title: qsTr("Charts") flags: (Fact.Group | Fact.Section | Fact.DragChildren) onSizeChanged: { - sgMainChart.resetEnable = true; + if (pageFact.active) + sgMainChart.resetEnable = true; changes = true; } } From f00faf3950761230a41302cf56de968a136ee9be Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Mon, 11 May 2026 20:52:03 +0300 Subject: [PATCH 144/163] Pinned charts reset updated. --- src/Plugins/Tools/Signals/Signals.qml | 15 +++++++++++++++ src/Plugins/Tools/Signals/SignalsMenuPage.qml | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/Plugins/Tools/Signals/Signals.qml b/src/Plugins/Tools/Signals/Signals.qml index 0dabe044d..1f395dbc1 100644 --- a/src/Plugins/Tools/Signals/Signals.qml +++ b/src/Plugins/Tools/Signals/Signals.qml @@ -81,6 +81,13 @@ Rectangle { autosaveTimer.restart(); } + function allowResetChart(num) { + for(var i = 0; i < pinsRepeater.count; ++i) { + if(num === pinsRepeater.itemAt(i).num) + pinsRepeater.itemAt(i).allowReset() + } + } + ColumnLayout { id: layout anchors.fill: parent @@ -88,6 +95,8 @@ Rectangle { property var chartLabelFont: apx.font_narrow(Style.fontSize * 0.8) Repeater { + id: pinsRepeater + model: sgControl.pinnedPages delegate: Item { @@ -97,6 +106,7 @@ Rectangle { required property int index property var pinnedPageFact: modelData + property var num: pinnedPageFact.num Layout.fillWidth: true Layout.preferredHeight: 110 * ui.scale @@ -159,6 +169,11 @@ Rectangle { } autosaveTimer.restart(); } + + function allowReset() { + sgPinnedChart.resetEnable = true; + } + } } diff --git a/src/Plugins/Tools/Signals/SignalsMenuPage.qml b/src/Plugins/Tools/Signals/SignalsMenuPage.qml index 8d7a38f3f..8c6128bcb 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuPage.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuPage.qml @@ -237,6 +237,8 @@ Fact { onSizeChanged: { if (pageFact.active) sgMainChart.resetEnable = true; + if(pageFact.pinned) + sgControl.allowResetChart(pageFact.num) changes = true; } } From 3f627532aaabd69bf17d150290db4b0900009bec Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 12 May 2026 13:02:40 +0300 Subject: [PATCH 145/163] Chart view rescale time bug fix. --- src/Plugins/Tools/Signals/SignalsChartView.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Plugins/Tools/Signals/SignalsChartView.qml b/src/Plugins/Tools/Signals/SignalsChartView.qml index 5b2b3b87c..0144888c3 100644 --- a/src/Plugins/Tools/Signals/SignalsChartView.qml +++ b/src/Plugins/Tools/Signals/SignalsChartView.qml @@ -117,6 +117,7 @@ Item { chartView.removeAllSeries(); chartView.sdata = []; chartView.time = 0; + chartView.timeRescale = 0; axisY.min = -dataPaddingZero; axisY.max = dataPaddingZero; axisY.tickCount = 4; From f859f9bee565eda70907cfad65295fc0ebbb1521 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 12 May 2026 13:35:33 +0300 Subject: [PATCH 146/163] Small menu set fix. --- src/Plugins/Tools/Signals/SignalsMenuSet.qml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsMenuSet.qml b/src/Plugins/Tools/Signals/SignalsMenuSet.qml index c77752523..0f65a3b04 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuSet.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuSet.qml @@ -117,8 +117,9 @@ Fact { var f = mPages.child(i); if (!f) continue; - if (f.pinned) - pinnedPages.push(f); + if (!f.pinned) + continue; + pinnedPages.push(f); } return pinnedPages.length > 0 ? pinnedPages : []; } @@ -139,8 +140,9 @@ Fact { var f = mPages.child(i); if (!f) continue; - if (f.active) - return f; + if (!f.active) + continue; + return f; } return null; } From 06193d3321b383be78ae4aa5e5ea29094c70d9df Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 12 May 2026 16:30:39 +0300 Subject: [PATCH 147/163] Signals charts refactoring. --- src/Plugins/Tools/Signals/Signals.qml | 137 +----------------- src/Plugins/Tools/Signals/SignalsButton.qml | 18 +-- .../Tools/Signals/SignalsChartItem.qml | 99 +++++++++++++ src/Plugins/Tools/Signals/SignalsMenuPage.qml | 8 +- 4 files changed, 112 insertions(+), 150 deletions(-) create mode 100644 src/Plugins/Tools/Signals/SignalsChartItem.qml diff --git a/src/Plugins/Tools/Signals/Signals.qml b/src/Plugins/Tools/Signals/Signals.qml index 1f395dbc1..f2fd1af00 100644 --- a/src/Plugins/Tools/Signals/Signals.qml +++ b/src/Plugins/Tools/Signals/Signals.qml @@ -65,22 +65,6 @@ Rectangle { return matches; } - function changeSpeed() { - if (!activePage) - return; - if (sgMainChart.speedFactorValue !== sgMainChart.speedFactor[sgMainChart.speedFactor.length - 1]) { - for (var i = 0; i < sgMainChart.speedFactor.length - 1; ++i) { - if (sgMainChart.speedFactor[i] <= sgMainChart.speedFactorValue && sgMainChart.speedFactorValue < sgMainChart.speedFactor[i + 1]) { - activePage.speed = sgMainChart.speedFactor[i + 1]; - break; - } - } - } else { - activePage.speed = sgMainChart.speedFactor[0]; - } - autosaveTimer.restart(); - } - function allowResetChart(num) { for(var i = 0; i < pinsRepeater.count; ++i) { if(num === pinsRepeater.itemAt(i).num) @@ -92,140 +76,33 @@ Rectangle { id: layout anchors.fill: parent - property var chartLabelFont: apx.font_narrow(Style.fontSize * 0.8) - Repeater { id: pinsRepeater model: sgControl.pinnedPages - delegate: Item { - id: pinnedChartArea - + delegate: SignalsChartItem { required property var modelData required property int index - property var pinnedPageFact: modelData - property var num: pinnedPageFact.num + ciPageFact: modelData Layout.fillWidth: true Layout.preferredHeight: 110 * ui.scale Layout.minimumHeight: 20 - - SignalsChartView { - id: sgPinnedChart - anchors.fill: parent - facts: pinnedPageFact ? pinnedPageFact.values : [] - speedFactorValue: pinnedPageFact ? pinnedPageFact.speed : 1 - } - - Rectangle { - anchors.top: parent.top - anchors.right: parent.right - anchors.margins: 4 * ui.scale - radius: 2 * ui.scale - visible: lblPinnedPage.text !== "" - color: maPinned.containsMouse ? "#50ffffff" : "#30ffffff" - implicitWidth: columnPinnedPage.implicitWidth + 10 * ui.scale - implicitHeight: columnPinnedPage.implicitHeight + 4 * ui.scale - - Column { - id: columnPinnedPage - anchors.centerIn: parent - Label { - id: lblPinnedPage - anchors.horizontalCenter: parent.horizontalCenter - text: pinnedPageFact ? pinnedPageFact.title : "" - font: layout.chartLabelFont - } - Label { - id: lblPinnedSpeed - anchors.right: parent.right - text: sgPinnedChart.speedFactorValue + "x" - font: layout.chartLabelFont - } - } - MouseArea { - id: maPinned - anchors.fill: parent - acceptedButtons: Qt.LeftButton - hoverEnabled: true - onClicked: changePinnedSpeed() - } - } - - function changePinnedSpeed() { - if (!pinnedPageFact) - return; - if (sgPinnedChart.speedFactorValue !== sgPinnedChart.speedFactor[sgPinnedChart.speedFactor.length - 1]) { - for (var i = 0; i < sgPinnedChart.speedFactor.length - 1; ++i) { - if (sgPinnedChart.speedFactor[i] <= sgPinnedChart.speedFactorValue && sgPinnedChart.speedFactorValue < sgPinnedChart.speedFactor[i + 1]) { - pinnedPageFact.speed = sgPinnedChart.speedFactor[i + 1]; - break; - } - } - } else { - pinnedPageFact.speed = sgPinnedChart.speedFactor[0]; - } - autosaveTimer.restart(); - } - - function allowReset() { - sgPinnedChart.resetEnable = true; - } - + clip: true } } - Item { + SignalsChartItem { id: mainChartArea + Layout.fillWidth: true Layout.fillHeight: true Layout.minimumHeight: 20 Layout.preferredHeight: 110 * ui.scale // 130 * ui.scale clip: true - SignalsChartView { - id: sgMainChart - anchors.fill: parent - facts: [] - } - Rectangle { - anchors.top: parent.top - anchors.right: parent.right - anchors.margins: 4 * ui.scale - radius: 2 * ui.scale - visible: lblMainPage.text !== "" - implicitWidth: columnMainPage.implicitWidth + 10 * ui.scale - implicitHeight: columnMainPage.implicitHeight + 4 * ui.scale - color: maMain.containsMouse ? "#50ffffff" : "#30ffffff" - opacity: 0.7 - - Column { - id: columnMainPage - anchors.centerIn: parent - Label { - id: lblMainPage - anchors.horizontalCenter: parent.horizontalCenter - text: sgControl.activePage ? sgControl.activePage.title : "" - font: layout.chartLabelFont - } - Label { - id: lblMainSpeed - anchors.right: parent.right - text: sgMainChart.speedFactorValue + "x" - font: layout.chartLabelFont - } - } - MouseArea { - id: maMain - anchors.fill: parent - acceptedButtons: Qt.LeftButton - hoverEnabled: true - onClicked: changeSpeed() - } - } - Rectangle { anchors.right: parent.right anchors.bottom: parent.bottom @@ -264,8 +141,8 @@ Rectangle { onCheckedButtonChanged: { if (checkedButton) return; - sgMainChart.resetEnable = true; - sgMainChart.facts = [] + mainChartArea.allowReset(); + mainChartArea.ciPageFact = null; } } diff --git a/src/Plugins/Tools/Signals/SignalsButton.qml b/src/Plugins/Tools/Signals/SignalsButton.qml index 3d3096379..1fea06b7b 100644 --- a/src/Plugins/Tools/Signals/SignalsButton.qml +++ b/src/Plugins/Tools/Signals/SignalsButton.qml @@ -30,10 +30,8 @@ TextButton { id: sgBtn property var pageFact: null - property var values: pageFact ? pageFact.values : [] property string pageToolTip: pageFact ? pageFact.pageToolTip : "" property bool pageWarning: pageFact ? pageFact.warnings : false - property var speed: pageFact ? pageFact.speed : 1 Layout.fillHeight: true checkable: true @@ -48,7 +46,7 @@ TextButton { if (!pageFact) return; if (checked) - sgMainChart.speedFactorValue = pageFact.speed; + mainChartArea.ciPageFact = pageFact; pageFact.active = checked; } @@ -57,20 +55,12 @@ TextButton { return; if (checked) pageFact.trigger(); - else - sgMainChart.speedFactorValue = speed; - } - onSpeedChanged: { - if (!pageFact) - return; - if (pageFact.active) - sgMainChart.speedFactorValue = speed; } onActivated: { - sgMainChart.resetEnable = true; - sgMainChart.facts = Qt.binding(function () { - return values; + mainChartArea.allowReset() + mainChartArea.ciPageFact = Qt.binding(function () { + return pageFact; }); } diff --git a/src/Plugins/Tools/Signals/SignalsChartItem.qml b/src/Plugins/Tools/Signals/SignalsChartItem.qml new file mode 100644 index 000000000..1fadc604a --- /dev/null +++ b/src/Plugins/Tools/Signals/SignalsChartItem.qml @@ -0,0 +1,99 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick +import QtQuick.Controls + +import QtCharts +import QtQml + +import Apx.Common + + +Item { + id: chartItem + + property var ciPageFact: null + property var num: ciPageFact ? ciPageFact.num : 0 + property var chartLabelFont: apx.font_narrow(Style.fontSize * 0.8) + + SignalsChartView { + id: ciChart + anchors.fill: parent + facts: ciPageFact ? ciPageFact.values : [] + speedFactorValue: ciPageFact ? ciPageFact.speed : 1 + } + + Rectangle { + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: 4 * ui.scale + radius: 2 * ui.scale + visible: lblPage.text !== "" + color: mouseArea.containsMouse ? "#50ffffff" : "#30ffffff" + implicitWidth: columnPage.implicitWidth + 10 * ui.scale + implicitHeight: columnPage.implicitHeight + 4 * ui.scale + + Column { + id: columnPage + anchors.centerIn: parent + Label { + id: lblPage + anchors.horizontalCenter: parent.horizontalCenter + text: ciPageFact ? ciPageFact.title : "" + font: chartLabelFont + } + Label { + id: lblSpeed + anchors.right: parent.right + text: ciChart.speedFactorValue + "x" + font: chartLabelFont + } + } + MouseArea { + id: mouseArea + anchors.fill: parent + acceptedButtons: Qt.LeftButton + hoverEnabled: true + onClicked: changeSpeed() + } + } + + function changeSpeed() { + if (!ciPageFact) + return; + if (ciChart.speedFactorValue !== ciChart.speedFactor[ciChart.speedFactor.length - 1]) { + for (var i = 0; i < ciChart.speedFactor.length - 1; ++i) { + if (ciChart.speedFactor[i] <= ciChart.speedFactorValue && ciChart.speedFactorValue < ciChart.speedFactor[i + 1]) { + ciPageFact.speed = ciChart.speedFactor[i + 1]; + break; + } + } + } else { + ciPageFact.speed = ciChart.speedFactor[0]; + } + autosaveTimer.restart(); + } + + function allowReset() { + ciChart.resetEnable = true; + } +} diff --git a/src/Plugins/Tools/Signals/SignalsMenuPage.qml b/src/Plugins/Tools/Signals/SignalsMenuPage.qml index 8c6128bcb..7645c7883 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuPage.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuPage.qml @@ -215,11 +215,7 @@ Fact { precision: 1 min: 0.2 max: 4 - onValueChanged: { - if (active && setFact.active) - sgMainChart.speedFactorValue = value; - changes = true; - } + onValueChanged: changes = true; } SignalsMenuChart { id: mMenuChart @@ -236,7 +232,7 @@ Fact { flags: (Fact.Group | Fact.Section | Fact.DragChildren) onSizeChanged: { if (pageFact.active) - sgMainChart.resetEnable = true; + mainChartArea.allowReset(); if(pageFact.pinned) sgControl.allowResetChart(pageFact.num) changes = true; From f07ff3253aaae92774144b09981e1e76d080f5fe Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 12 May 2026 16:55:56 +0300 Subject: [PATCH 148/163] Set and page descr update improved. --- src/Plugins/Tools/Signals/SignalsMenuChart.qml | 1 + src/Plugins/Tools/Signals/SignalsMenuPage.qml | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Plugins/Tools/Signals/SignalsMenuChart.qml b/src/Plugins/Tools/Signals/SignalsMenuChart.qml index 42bc4d80e..9661627e1 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuChart.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuChart.qml @@ -111,6 +111,7 @@ Fact { return; if (mBind.text != "") title = mBind.text; + pageFact.updateDescr(); } function updateDescr() { diff --git a/src/Plugins/Tools/Signals/SignalsMenuPage.qml b/src/Plugins/Tools/Signals/SignalsMenuPage.qml index 7645c7883..051bc3d6e 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuPage.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuPage.qml @@ -150,6 +150,7 @@ Fact { return; var text = mPageName.text.trim(); title = text != "" ? text : qsTr("P") + (Math.max(pageFact.num, 0) + 1); + setFact.updateDescr(); } function updateDescr() { From 1bd6b00699d9a8f47ce76345fb69f398b85092f9 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 13 May 2026 16:56:22 +0300 Subject: [PATCH 149/163] Pinned charts without reset when update. --- src/Plugins/Tools/Signals/Signals.qml | 32 ++++------ src/Plugins/Tools/Signals/SignalsMenu.qml | 9 --- src/Plugins/Tools/Signals/SignalsMenuPage.qml | 15 ++++- src/Plugins/Tools/Signals/SignalsMenuSet.qml | 12 ---- .../Tools/Signals/SignalsPinnedModel.qml | 64 +++++++++++++++++++ 5 files changed, 88 insertions(+), 44 deletions(-) create mode 100644 src/Plugins/Tools/Signals/SignalsPinnedModel.qml diff --git a/src/Plugins/Tools/Signals/Signals.qml b/src/Plugins/Tools/Signals/Signals.qml index f2fd1af00..4b1f06dad 100644 --- a/src/Plugins/Tools/Signals/Signals.qml +++ b/src/Plugins/Tools/Signals/Signals.qml @@ -37,9 +37,8 @@ Rectangle { readonly property var pages: sgMenu.getActivePages() readonly property var activeSet: sgMenu.getActiveSet() - readonly property var activePage: sgMenu.getActivePage() - readonly property var pinnedPages: sgMenu.getPinnedPages() - + + onActiveSetChanged: pinnedModel.updateModel(sgMenu.getPinnedPages()) Component.onCompleted: { if (buttonGroup.buttons.length <= 0) return; @@ -66,9 +65,9 @@ Rectangle { } function allowResetChart(num) { - for(var i = 0; i < pinsRepeater.count; ++i) { - if(num === pinsRepeater.itemAt(i).num) - pinsRepeater.itemAt(i).allowReset() + for(var i = 0; i < pinnedRepeater.count; ++i) { + if(num === pinnedRepeater.itemAt(i).num) + pinnedRepeater.itemAt(i).allowReset() } } @@ -76,22 +75,13 @@ Rectangle { id: layout anchors.fill: parent - Repeater { - id: pinsRepeater - - model: sgControl.pinnedPages - - delegate: SignalsChartItem { - required property var modelData - required property int index - - ciPageFact: modelData + SignalsPinnedModel { + id: pinnedModel + } - Layout.fillWidth: true - Layout.preferredHeight: 110 * ui.scale - Layout.minimumHeight: 20 - clip: true - } + Repeater { + id: pinnedRepeater + model: pinnedModel } SignalsChartItem { diff --git a/src/Plugins/Tools/Signals/SignalsMenu.qml b/src/Plugins/Tools/Signals/SignalsMenu.qml index d3e246e0c..1d308ccb5 100644 --- a/src/Plugins/Tools/Signals/SignalsMenu.qml +++ b/src/Plugins/Tools/Signals/SignalsMenu.qml @@ -244,15 +244,6 @@ Fact { return activeSet.getPages(); } - function getActivePage() { - if (sgMenu.size <= 0) - return null; - var activeSet = getActiveSet(); - if (!activeSet) - return null; - return activeSet.getActivePage(); - } - function getPinnedPages() { if (sgMenu.size <= 0) return []; diff --git a/src/Plugins/Tools/Signals/SignalsMenuPage.qml b/src/Plugins/Tools/Signals/SignalsMenuPage.qml index 051bc3d6e..38021b01f 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuPage.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuPage.qml @@ -40,6 +40,7 @@ Fact { signal addTriggered + onPinnedChanged: updatePinnedModel() Component.onDestruction: removed() // pinned menu closes when the plugin is closed Component.onCompleted: { load(data); @@ -190,6 +191,15 @@ Fact { pageToolTip = s.join("
"); } + function updatePinnedModel() { + if(!setFact.active) + return; + if(pinned) + pinnedModel.addPage(pageFact); + else + pinnedModel.removePage(num); + } + Fact { id: mPageName title: qsTr("Page name") @@ -265,9 +275,10 @@ Fact { visible: !newItem icon: "delete" onTriggered: { - var active = pageFact.active; + if(pageFact.active) + setFact.setChecked(0) + pageFact.pinned = false; pageFact.deleteFact(); - if(active) setFact.setChecked(0); } } } diff --git a/src/Plugins/Tools/Signals/SignalsMenuSet.qml b/src/Plugins/Tools/Signals/SignalsMenuSet.qml index 0f65a3b04..b78c8f842 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuSet.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuSet.qml @@ -135,18 +135,6 @@ Fact { return pages.length > 0 ? pages : []; } - function getActivePage() { - for (var i = 0; i < mPages.size; ++i) { - var f = mPages.child(i); - if (!f) - continue; - if (!f.active) - continue; - return f; - } - return null; - } - // Check for binding script variable matches function checkScrMatches(val) { for (var i = 0; i < mPages.size; ++i) diff --git a/src/Plugins/Tools/Signals/SignalsPinnedModel.qml b/src/Plugins/Tools/Signals/SignalsPinnedModel.qml new file mode 100644 index 000000000..ceeb11a60 --- /dev/null +++ b/src/Plugins/Tools/Signals/SignalsPinnedModel.qml @@ -0,0 +1,64 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import QtQuick +import QtQml.Models +import QtQuick.Layouts + +import Apx.Common + + +ObjectModel { + id: pinnedModel + + function addPage(fact) { + if(!fact) + return; + var component = Qt.createComponent("SignalsChartItem.qml"); + if (component.status === Component.Ready) { + var c=component.createObject(layout, {"ciPageFact": fact, + "Layout.fillWidth": true, + "Layout.preferredHeight": Qt.binding(function(){return 110 * ui.scale}), + "Layout.minimumHeight": 20, + "clip": true}); + pinnedModel.append(c); + } + } + + function removePage(num) { + for(var i = 0; i < pinnedModel.count; ++i) { + if(pinnedModel.get(i).num !== num) + continue; + pinnedModel.remove(i) + } + } + + function updateModel(pageList) { + pinnedModel.clear(); + for(var i = 0; i < pageList.length; ++i) { + var f = pageList[i] + if(!f) + continue; + pinnedModel.addPage(f) + } + } +} From e4d2d1df82b8ef524e2922f695919f751ad5e1a1 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 13 May 2026 17:59:03 +0300 Subject: [PATCH 150/163] A similar lightblue color has been replaced --- src/Plugins/Tools/Signals/SignalsMenuColor.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsMenuColor.qml b/src/Plugins/Tools/Signals/SignalsMenuColor.qml index 8564b5627..206fb5d90 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuColor.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuColor.qml @@ -37,11 +37,11 @@ Fact { qsTr("Deep Purple"), qsTr("Indigo"), qsTr("Blue"), - qsTr("Light Blue"), qsTr("Cyan"), qsTr("Teal"), qsTr("Green"), qsTr("Orange"), + qsTr("Yellow"), qsTr("Blue Grey") ] readonly property var colorBaseValues: [ @@ -51,10 +51,10 @@ Fact { Material.DeepPurple, Material.Indigo, Material.Blue, - Material.LightBlue, Material.Cyan, Material.Teal, Material.Green, + Material.Yellow, Material.Orange, Material.BlueGrey ] From 81477b89d7fe05bb8e871cd6ff78c118520c6f47 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 13 May 2026 18:31:17 +0300 Subject: [PATCH 151/163] Chart label style updated. --- src/Plugins/Tools/Signals/Signals.qml | 4 ++-- src/Plugins/Tools/Signals/SignalsChartItem.qml | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Plugins/Tools/Signals/Signals.qml b/src/Plugins/Tools/Signals/Signals.qml index 4b1f06dad..81397e2a3 100644 --- a/src/Plugins/Tools/Signals/Signals.qml +++ b/src/Plugins/Tools/Signals/Signals.qml @@ -109,7 +109,7 @@ Rectangle { id: lblMainSet anchors.centerIn: parent text: sgControl.activeSet ? sgControl.activeSet.title : "" - font: apx.font_narrow(Style.fontSize * 0.8) + font: mainChartArea.labelFont } } @@ -117,7 +117,7 @@ Rectangle { anchors.centerIn: parent visible: btnRepeater.count <= 0 text: qsTr("No pages in the active set") - font: apx.font_narrow(Style.fontSize * 0.8) + font: mainChartArea.labelFont color: Material.secondaryTextColor background: Rectangle { color: sgControl.color diff --git a/src/Plugins/Tools/Signals/SignalsChartItem.qml b/src/Plugins/Tools/Signals/SignalsChartItem.qml index 1fadc604a..3a417c875 100644 --- a/src/Plugins/Tools/Signals/SignalsChartItem.qml +++ b/src/Plugins/Tools/Signals/SignalsChartItem.qml @@ -33,7 +33,7 @@ Item { property var ciPageFact: null property var num: ciPageFact ? ciPageFact.num : 0 - property var chartLabelFont: apx.font_narrow(Style.fontSize * 0.8) + property var labelFont: apx.font_narrow(Style.fontSize * 0.8) SignalsChartView { id: ciChart @@ -55,17 +55,19 @@ Item { Column { id: columnPage anchors.centerIn: parent + opacity: 0.7 + Label { id: lblPage anchors.horizontalCenter: parent.horizontalCenter text: ciPageFact ? ciPageFact.title : "" - font: chartLabelFont + font: labelFont } Label { id: lblSpeed anchors.right: parent.right text: ciChart.speedFactorValue + "x" - font: chartLabelFont + font: labelFont } } MouseArea { From 167a6177dd415f70cda15690e7400cdf2e350fbb Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 14 May 2026 08:57:14 +0300 Subject: [PATCH 152/163] Color choser refactoring. --- .../Tools/Signals/SignalsColorChooser.qml | 22 ++++++++++++++++++- .../Tools/Signals/SignalsMenuColor.qml | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsColorChooser.qml b/src/Plugins/Tools/Signals/SignalsColorChooser.qml index 1abb3efcb..6dfa9bcdd 100644 --- a/src/Plugins/Tools/Signals/SignalsColorChooser.qml +++ b/src/Plugins/Tools/Signals/SignalsColorChooser.qml @@ -1,6 +1,26 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ import QtQuick - import APX.Facts Fact { diff --git a/src/Plugins/Tools/Signals/SignalsMenuColor.qml b/src/Plugins/Tools/Signals/SignalsMenuColor.qml index 206fb5d90..ce02cb12d 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuColor.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuColor.qml @@ -40,8 +40,8 @@ Fact { qsTr("Cyan"), qsTr("Teal"), qsTr("Green"), - qsTr("Orange"), qsTr("Yellow"), + qsTr("Orange"), qsTr("Blue Grey") ] readonly property var colorBaseValues: [ From 75725b3f4186fd0853d673c475f1d2ad3d4ae15e Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 14 May 2026 09:00:19 +0300 Subject: [PATCH 153/163] Buttons model has been added. --- src/Plugins/Tools/Signals/Signals.qml | 24 +++---- src/Plugins/Tools/Signals/SignalsButton.qml | 7 ++- .../Tools/Signals/SignalsButtonsModel.qml | 63 +++++++++++++++++++ .../Tools/Signals/SignalsChartItem.qml | 2 +- src/Plugins/Tools/Signals/SignalsMenuPage.qml | 4 +- src/Plugins/Tools/Signals/SignalsMenuSet.qml | 3 +- .../Tools/Signals/SignalsPinnedModel.qml | 2 - 7 files changed, 87 insertions(+), 18 deletions(-) create mode 100644 src/Plugins/Tools/Signals/SignalsButtonsModel.qml diff --git a/src/Plugins/Tools/Signals/Signals.qml b/src/Plugins/Tools/Signals/Signals.qml index 81397e2a3..48d681b76 100644 --- a/src/Plugins/Tools/Signals/Signals.qml +++ b/src/Plugins/Tools/Signals/Signals.qml @@ -38,7 +38,7 @@ Rectangle { readonly property var pages: sgMenu.getActivePages() readonly property var activeSet: sgMenu.getActiveSet() - onActiveSetChanged: pinnedModel.updateModel(sgMenu.getPinnedPages()) + onActiveSetChanged: updateModels() Component.onCompleted: { if (buttonGroup.buttons.length <= 0) return; @@ -56,6 +56,11 @@ Rectangle { } } + function updateModels() { + pinnedModel.updateModel(sgMenu.getPinnedPages()) + buttonsModel.updateModel(sgMenu.getActivePages()) + } + function checkScrMatches(val) { var matches = false; for (var i = 0; i < buttonGroup.buttons.length; ++i) @@ -140,20 +145,15 @@ Rectangle { id: bottomArea Layout.fillWidth: true Layout.margins: Style.spacing - spacing: 3 Layout.maximumHeight: 24 * ui.scale + spacing: 3 + + SignalsButtonsModel { + id: buttonsModel + } Repeater { id: btnRepeater - model: sgControl.pages - - delegate: SignalsButton { - required property int index - required property var modelData - - property int pageIndex: index - - pageFact: modelData - } + model: buttonsModel } IconButton { iconName: "plus" diff --git a/src/Plugins/Tools/Signals/SignalsButton.qml b/src/Plugins/Tools/Signals/SignalsButton.qml index 1fea06b7b..3f1a56f3d 100644 --- a/src/Plugins/Tools/Signals/SignalsButton.qml +++ b/src/Plugins/Tools/Signals/SignalsButton.qml @@ -32,6 +32,7 @@ TextButton { property var pageFact: null property string pageToolTip: pageFact ? pageFact.pageToolTip : "" property bool pageWarning: pageFact ? pageFact.warnings : false + property var num: pageFact ? pageFact.num : -1 Layout.fillHeight: true checkable: true @@ -40,8 +41,12 @@ TextButton { textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor toolTip: pageFact ? pageFact.pageToolTip : "" Material.background: pageWarning ? Material.color(Material.Orange) : color - checked: pageFact ? pageFact.active : false + Component.onCompleted: { + if(!pageFact) + return; + checked = pageFact.active + } onCheckedChanged: { if (!pageFact) return; diff --git a/src/Plugins/Tools/Signals/SignalsButtonsModel.qml b/src/Plugins/Tools/Signals/SignalsButtonsModel.qml new file mode 100644 index 000000000..7c51feaa3 --- /dev/null +++ b/src/Plugins/Tools/Signals/SignalsButtonsModel.qml @@ -0,0 +1,63 @@ +/* + * APX Autopilot project + * + * Copyright (c) 2003-2020, Aliaksei Stratsilatau + * All rights reserved + * + * This file is part of APX Ground Control. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +import QtQuick +import QtQml.Models +import QtQuick.Layouts + +import Apx.Common + + +ObjectModel { + id: buttonsModel + + function addButton(fact) { + if(!fact) + return; + var component = Qt.createComponent("SignalsButton.qml"); + if (component.status === Component.Ready) { + var c=component.createObject(bottomArea, {"pageFact": fact}); + buttonsModel.append(c); + } + } + + function removeButton(num) { + for(var i = 0; i < buttonsModel.count; ++i) { + var btn = buttonsModel.get(i); + if(btn.num !== num) + continue; + // Check if this is the main chart button + if(btn.checked) + buttonsModel.get(0).checked = true; + buttonsModel.remove(i) + } + } + + function updateModel(pageList) { + buttonsModel.clear(); + for(var i = 0; i < pageList.length; ++i) { + var f = pageList[i] + if(!f) + continue; + buttonsModel.addButton(f) + } + } +} diff --git a/src/Plugins/Tools/Signals/SignalsChartItem.qml b/src/Plugins/Tools/Signals/SignalsChartItem.qml index 3a417c875..96979269b 100644 --- a/src/Plugins/Tools/Signals/SignalsChartItem.qml +++ b/src/Plugins/Tools/Signals/SignalsChartItem.qml @@ -32,7 +32,7 @@ Item { id: chartItem property var ciPageFact: null - property var num: ciPageFact ? ciPageFact.num : 0 + property var num: ciPageFact ? ciPageFact.num : -1 property var labelFont: apx.font_narrow(Style.fontSize * 0.8) SignalsChartView { diff --git a/src/Plugins/Tools/Signals/SignalsMenuPage.qml b/src/Plugins/Tools/Signals/SignalsMenuPage.qml index 38021b01f..aa76434cc 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuPage.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuPage.qml @@ -275,8 +275,10 @@ Fact { visible: !newItem icon: "delete" onTriggered: { - if(pageFact.active) + if(pageFact.active) setFact.setChecked(0) + if(setFact.active) + buttonsModel.removeButton(pageFact.num) pageFact.pinned = false; pageFact.deleteFact(); } diff --git a/src/Plugins/Tools/Signals/SignalsMenuSet.qml b/src/Plugins/Tools/Signals/SignalsMenuSet.qml index b78c8f842..7f6ec2583 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuSet.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuSet.qml @@ -40,7 +40,7 @@ Fact { Component.onCompleted: load(data) Component.onDestruction: removed() // pinned menu closes when the plugin is closed - onCheckedPageChanged: if(active) sgMenu.saveSettings() + onCheckedPageChanged: if(active) sgMenu.saveSettings() function save() { changes = false; @@ -172,6 +172,7 @@ Fact { title: qsTr("Pages") flags: (Fact.Group | Fact.Section | Fact.DragChildren) onSizeChanged: updateDescr() + onItemInserted: (fact)=>{if(setFact.active) buttonsModel.addButton(fact)} } // Actions diff --git a/src/Plugins/Tools/Signals/SignalsPinnedModel.qml b/src/Plugins/Tools/Signals/SignalsPinnedModel.qml index ceeb11a60..e7d18e2e0 100644 --- a/src/Plugins/Tools/Signals/SignalsPinnedModel.qml +++ b/src/Plugins/Tools/Signals/SignalsPinnedModel.qml @@ -19,14 +19,12 @@ * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ - import QtQuick import QtQml.Models import QtQuick.Layouts import Apx.Common - ObjectModel { id: pinnedModel From bf9a83c28f74e5367613da7c77a39a5bcbdcb607 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 14 May 2026 16:31:02 +0300 Subject: [PATCH 154/163] Buttons model check buttons fix. --- src/Plugins/Tools/Signals/Signals.qml | 5 ++++ src/Plugins/Tools/Signals/SignalsButton.qml | 3 ++ .../Tools/Signals/SignalsButtonsModel.qml | 28 +++++++++++++++---- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/Plugins/Tools/Signals/Signals.qml b/src/Plugins/Tools/Signals/Signals.qml index 48d681b76..623ce59d3 100644 --- a/src/Plugins/Tools/Signals/Signals.qml +++ b/src/Plugins/Tools/Signals/Signals.qml @@ -76,6 +76,11 @@ Rectangle { } } + function clearButtonGroup() { + buttonGroup.buttons = []; + buttonGroup.checkedButton = null; + } + ColumnLayout { id: layout anchors.fill: parent diff --git a/src/Plugins/Tools/Signals/SignalsButton.qml b/src/Plugins/Tools/Signals/SignalsButton.qml index 3f1a56f3d..52b1d8d90 100644 --- a/src/Plugins/Tools/Signals/SignalsButton.qml +++ b/src/Plugins/Tools/Signals/SignalsButton.qml @@ -52,6 +52,9 @@ TextButton { return; if (checked) mainChartArea.ciPageFact = pageFact; + // Check if set changed and model reset + if(buttonsModel.count === 0) + return; pageFact.active = checked; } diff --git a/src/Plugins/Tools/Signals/SignalsButtonsModel.qml b/src/Plugins/Tools/Signals/SignalsButtonsModel.qml index 7c51feaa3..4bbbb65e8 100644 --- a/src/Plugins/Tools/Signals/SignalsButtonsModel.qml +++ b/src/Plugins/Tools/Signals/SignalsButtonsModel.qml @@ -44,15 +44,28 @@ ObjectModel { var btn = buttonsModel.get(i); if(btn.num !== num) continue; - // Check if this is the main chart button - if(btn.checked) - buttonsModel.get(0).checked = true; - buttonsModel.remove(i) + buttonsModel.remove(i); } + + if(buttonsModel.count === 0) + return; + + var index = 0; + for(var i = 0; i < buttonsModel.count; ++i) { + if (buttonsModel.get(i).checked){ + index = i; + } + } + buttonsModel.get(index).checked = true; } function updateModel(pageList) { - buttonsModel.clear(); + // for(var i = 0; i < buttonsModel.count; ++i) { + // var btn = buttonsModel.get(i); + // buttonsModel.remove(i); + // btn.destroy(); + // } + clearModel(); for(var i = 0; i < pageList.length; ++i) { var f = pageList[i] if(!f) @@ -60,4 +73,9 @@ ObjectModel { buttonsModel.addButton(f) } } + + function clearModel() { + buttonsModel.clear(); + sgControl.clearButtonGroup(); // ButtonGroup keep model element after clear + } } From 27f45834f41309a915c66c20c38b3652b0ee57c4 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 14 May 2026 16:31:36 +0300 Subject: [PATCH 155/163] Reset to default for buttons model updated. --- src/Plugins/Tools/Signals/SignalsMenu.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Plugins/Tools/Signals/SignalsMenu.qml b/src/Plugins/Tools/Signals/SignalsMenu.qml index 1d308ccb5..b289dc9a3 100644 --- a/src/Plugins/Tools/Signals/SignalsMenu.qml +++ b/src/Plugins/Tools/Signals/SignalsMenu.qml @@ -197,12 +197,16 @@ Fact { } function resetToDefaults() { + var setIndex = -1 var set = createDefaultSet(); for(var i = 0; i < sgMenu.size; ++ i) { var title = sgMenu.child(i).title.trim().toLowerCase() if (title === "default") { var defaultSet = sgMenu.child(i); + if(defaultSet.active) { + buttonsModel.clearModel() + } defaultSet.load(set); defaultSet.move(0) setIndex = i; From 24cda008d19d35dd672015410f7564724f7a64d9 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 14 May 2026 17:17:28 +0300 Subject: [PATCH 156/163] Default set reset smal fix. --- .../Tools/Signals/SignalsButtonsModel.qml | 24 ++++++++++--------- src/Plugins/Tools/Signals/SignalsMenu.qml | 1 + 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsButtonsModel.qml b/src/Plugins/Tools/Signals/SignalsButtonsModel.qml index 4bbbb65e8..5383c9398 100644 --- a/src/Plugins/Tools/Signals/SignalsButtonsModel.qml +++ b/src/Plugins/Tools/Signals/SignalsButtonsModel.qml @@ -46,17 +46,7 @@ ObjectModel { continue; buttonsModel.remove(i); } - - if(buttonsModel.count === 0) - return; - - var index = 0; - for(var i = 0; i < buttonsModel.count; ++i) { - if (buttonsModel.get(i).checked){ - index = i; - } - } - buttonsModel.get(index).checked = true; + autoChecked(); } function updateModel(pageList) { @@ -74,6 +64,18 @@ ObjectModel { } } + function autoChecked() { + if(buttonsModel.count === 0) + return; + var index = 0; + for(var i = 0; i < buttonsModel.count; ++i) { + if (buttonsModel.get(i).checked){ + index = i; + } + } + buttonsModel.get(index).checked = true; + } + function clearModel() { buttonsModel.clear(); sgControl.clearButtonGroup(); // ButtonGroup keep model element after clear diff --git a/src/Plugins/Tools/Signals/SignalsMenu.qml b/src/Plugins/Tools/Signals/SignalsMenu.qml index b289dc9a3..85a2386c2 100644 --- a/src/Plugins/Tools/Signals/SignalsMenu.qml +++ b/src/Plugins/Tools/Signals/SignalsMenu.qml @@ -210,6 +210,7 @@ Fact { defaultSet.load(set); defaultSet.move(0) setIndex = i; + buttonsModel.autoChecked() break; } } From f4d79d5f3898af04185afdaf095c099e35d8ab1b Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 14 May 2026 17:27:06 +0300 Subject: [PATCH 157/163] Signals button fix. --- src/Plugins/Tools/Signals/SignalsButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugins/Tools/Signals/SignalsButton.qml b/src/Plugins/Tools/Signals/SignalsButton.qml index 52b1d8d90..a61a4a51e 100644 --- a/src/Plugins/Tools/Signals/SignalsButton.qml +++ b/src/Plugins/Tools/Signals/SignalsButton.qml @@ -40,7 +40,7 @@ TextButton { text: pageFact ? pageFact.title.slice(0, 3) : getDefaultText() textColor: checked ? Material.color(Material.Yellow) : Material.primaryTextColor toolTip: pageFact ? pageFact.pageToolTip : "" - Material.background: pageWarning ? Material.color(Material.Orange) : color + Material.background: pageWarning ? Material.color(Material.Orange) : sgBtn.color Component.onCompleted: { if(!pageFact) From a220ca8248f1e9d0bc19a1ea06d738131973fd09 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 14 May 2026 17:29:07 +0300 Subject: [PATCH 158/163] Load settings fix. --- src/Plugins/Tools/Signals/SignalsMenu.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Plugins/Tools/Signals/SignalsMenu.qml b/src/Plugins/Tools/Signals/SignalsMenu.qml index 85a2386c2..a3eea9aa2 100644 --- a/src/Plugins/Tools/Signals/SignalsMenu.qml +++ b/src/Plugins/Tools/Signals/SignalsMenu.qml @@ -121,6 +121,7 @@ Fact { sets.push(set); } //set index + if(!json.active)json.active={} var setIdx = json.active[name]; if (setIdx >= 0 && setIdx < sets.length) currentSetIdx = setIdx; From eaf9517ce8ebb10325fa7434d9fb6a09997c088a Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Tue, 19 May 2026 11:33:42 +0300 Subject: [PATCH 159/163] Axis values jerking fix. --- src/Plugins/Tools/Signals/SignalsChartView.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Plugins/Tools/Signals/SignalsChartView.qml b/src/Plugins/Tools/Signals/SignalsChartView.qml index 0144888c3..72026403b 100644 --- a/src/Plugins/Tools/Signals/SignalsChartView.qml +++ b/src/Plugins/Tools/Signals/SignalsChartView.qml @@ -152,7 +152,6 @@ Item { bmod = true; } if (bmod) { - axisY.tickCount = 4; axisY.applyNiceNumbers(); } } From 6fadd96bc5025abaf75257611f585237030b7a5f Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 20 May 2026 12:59:40 +0300 Subject: [PATCH 160/163] Reset active defaults pinned fix. --- src/Plugins/Tools/Signals/SignalsMenu.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Plugins/Tools/Signals/SignalsMenu.qml b/src/Plugins/Tools/Signals/SignalsMenu.qml index a3eea9aa2..6695e6773 100644 --- a/src/Plugins/Tools/Signals/SignalsMenu.qml +++ b/src/Plugins/Tools/Signals/SignalsMenu.qml @@ -206,6 +206,7 @@ Fact { if (title === "default") { var defaultSet = sgMenu.child(i); if(defaultSet.active) { + pinnedModel.clear(); buttonsModel.clearModel() } defaultSet.load(set); From 90734c6bc9024b271c2340bd5c793a7abf55aba5 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Wed, 20 May 2026 14:56:12 +0300 Subject: [PATCH 161/163] Set menu first set deletion fix. --- src/Plugins/Tools/Signals/SignalsMenuSet.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Plugins/Tools/Signals/SignalsMenuSet.qml b/src/Plugins/Tools/Signals/SignalsMenuSet.qml index 7f6ec2583..1b935b72d 100644 --- a/src/Plugins/Tools/Signals/SignalsMenuSet.qml +++ b/src/Plugins/Tools/Signals/SignalsMenuSet.qml @@ -198,8 +198,9 @@ Fact { title: qsTr("Remove") icon: "delete" onTriggered: { - if (setFact.active) setFact.selected(0); + var isActive = setFact.active; setFact.deleteFact(); + if (isActive) setFact.selected(0); } } } From b1472c8ac1b452427d40a6da602c4208e480d083 Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 21 May 2026 13:37:34 +0300 Subject: [PATCH 162/163] Chart axis labels truncate after applyNiceNumbers fix. --- src/Plugins/Tools/Signals/SignalsChartView.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Plugins/Tools/Signals/SignalsChartView.qml b/src/Plugins/Tools/Signals/SignalsChartView.qml index 72026403b..2dfae455b 100644 --- a/src/Plugins/Tools/Signals/SignalsChartView.qml +++ b/src/Plugins/Tools/Signals/SignalsChartView.qml @@ -106,6 +106,7 @@ Item { labelsColor: "white" labelsFont: apx.font_narrow(Style.fontSize * 0.65) gridLineColor: "#555" + truncateLabels: false // don't hide labels with small vertical space } property real dataPadding: 0.05 From 7d2a6ad9bb3667dbb7b17c402a6451617ee45f6b Mon Sep 17 00:00:00 2001 From: SokolovskyYury Date: Thu, 21 May 2026 13:48:12 +0300 Subject: [PATCH 163/163] Initialization of the pinned chart with uncgangeable zero value fix. --- src/Plugins/Tools/Signals/SignalsPinnedModel.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Plugins/Tools/Signals/SignalsPinnedModel.qml b/src/Plugins/Tools/Signals/SignalsPinnedModel.qml index e7d18e2e0..eb13fa049 100644 --- a/src/Plugins/Tools/Signals/SignalsPinnedModel.qml +++ b/src/Plugins/Tools/Signals/SignalsPinnedModel.qml @@ -33,11 +33,12 @@ ObjectModel { return; var component = Qt.createComponent("SignalsChartItem.qml"); if (component.status === Component.Ready) { - var c=component.createObject(layout, {"ciPageFact": fact, - "Layout.fillWidth": true, + var c=component.createObject(layout, {"Layout.fillWidth": true, "Layout.preferredHeight": Qt.binding(function(){return 110 * ui.scale}), "Layout.minimumHeight": 20, "clip": true}); + c.allowReset(); + c.ciPageFact = fact; pinnedModel.append(c); } }