Skip to content

Commit f174413

Browse files
Have a working table just need to add scrollbar.
1 parent 3e9bd43 commit f174413

File tree

5 files changed

+118
-108
lines changed

5 files changed

+118
-108
lines changed

console_backend/src/constants.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ pub const SHOW_LEGEND: &str = "Show Legend";
3737
pub const PLOT_HISTORY_MAX: usize = 1000;
3838
pub const DILUTION_OF_PRECISION_UNITS: f64 = 0.01;
3939
pub const NUM_GNSS_MODES: usize = 6;
40+
pub const LAT_MAX: f64 = 90_f64;
41+
pub const LAT_MIN: f64 = -90_f64;
42+
pub const LON_MAX: f64 = 180_f64;
43+
pub const LON_MIN: f64 = -180_f64;
4044
pub const NO_FIX_LABEL: &str = "No Fix";
4145
pub const SPP_LABEL: &str = "SPP";
4246
pub const DGNSS_LABEL: &str = "DGPS";

console_backend/src/solution_tab.rs

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,10 @@ impl SolutionTab {
533533

534534
pub fn solution_draw(&mut self) {
535535
let current_mode: Option<String> = if self.pending_draw_modes.len()>0 {
536+
self.lat_min = LAT_MAX;
537+
self.lat_max = LAT_MIN;
538+
self.lon_min = LON_MAX;
539+
self.lon_max = LON_MIN;
536540
Some(self.pending_draw_modes[self.pending_draw_modes.len()-1].clone())
537541
} else {
538542
None
@@ -558,9 +562,9 @@ impl SolutionTab {
558562
let lng = last_lng; // - self.offset) * self.sf
559563

560564
let lat_str = format!("lat_{}", mode_string);
561-
let lng_str = format!("lng_{}", mode_string);
565+
let lon_str = format!("lng_{}", mode_string);
562566
self.slns.get_mut(&lat_str).unwrap().add(lat);
563-
self.slns.get_mut(&lng_str).unwrap().add(lng);
567+
self.slns.get_mut(&lon_str).unwrap().add(lng);
564568
self._append_empty_sln_data(Some(mode_string));
565569
}
566570

@@ -570,37 +574,40 @@ impl SolutionTab {
570574
continue;
571575
}
572576
let lat_str = format!("lat_{}", each_mode);
573-
let lng_str = format!("lng_{}", each_mode);
577+
let lon_str = format!("lng_{}", each_mode);
574578
self.slns.get_mut(&lat_str).unwrap().add(f64::NAN);
575-
self.slns.get_mut(&lng_str).unwrap().add(f64::NAN);
579+
self.slns.get_mut(&lon_str).unwrap().add(f64::NAN);
576580
}
577581
}
578582

579583
fn _synchronize_plot_data_by_mode(&mut self, mode_string: &String, update_current: bool) {
580584
let lat_string = format!("lat_{}", mode_string);
581-
let lng_string = format!("lng_{}", mode_string);
585+
let lon_string = format!("lng_{}", mode_string);
582586

583587
if let Some(idx) = self.mode_strings.iter().position(|x| *x == *mode_string) {
584-
self.sln_data[idx] = self.slns[&lat_string].get()
585-
.iter()
586-
.zip(self.slns[&lng_string].get().iter())
587-
.filter(|(x, y)| !x.is_nan() || !y.is_nan())
588-
.map(|(x, y)| (*y, *x))
589-
.collect();
588+
let lat_values = self.slns[&lat_string].get();
589+
let lon_values = self.slns[&lon_string].get();
590+
591+
let mut new_sln: Vec<(f64, f64)> = vec![];
592+
for jdx in 0..lat_values.len() {
593+
if lat_values[jdx].is_nan() || lon_values[jdx].is_nan() {
594+
continue;
595+
}
596+
self.lat_min = f64::min(self.lat_min, lat_values[jdx]);
597+
self.lat_max = f64::max(self.lat_max, lat_values[jdx]);
598+
self.lon_min = f64::min(self.lon_min, lon_values[jdx]);
599+
self.lon_max = f64::max(self.lon_max, lon_values[jdx]);
600+
new_sln.push((lon_values[jdx], lat_values[jdx]));
601+
}
602+
self.sln_data[idx] = new_sln;
603+
590604
if update_current {
591605
if self.sln_data[idx].len() > 0 {
592606
self.sln_cur_data[idx] = self.sln_data[idx][self.sln_data[idx].len()-1];
593607
} else {
594608
self.sln_cur_data[idx] = (f64::NAN, f64::NAN);
595609
}
596-
}
597-
if self.sln_data[idx].len()>10 {
598-
self.lat_max = self.sln_data[idx][0].1;
599-
self.lat_min = self.sln_data[idx][self.sln_data[idx].len()-1].1;
600-
self.lon_max = self.sln_data[idx][0].0;
601-
self.lon_min = self.sln_data[idx][self.sln_data[idx].len()-1].0;
602-
}
603-
610+
}
604611
}
605612
}
606613

resources/SolutionTabComponents/SolutionPositionTab.qml

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import SwiftConsole 1.0
77
Item {
88
id: solutionPositionTab
99

10+
property variant scatters: []
1011
property variant lines: []
1112
property variant labels: []
1213
property variant colors: []
@@ -173,18 +174,25 @@ Item {
173174
if (labels != solutionPositionPoints.labels)
174175
labels = solutionPositionPoints.labels;
175176

176-
if (!lines.length){
177+
if (!lines.length || !scatters.length){
177178
for (var idx in labels) {
179+
var scatter = solutionPositionChart.createSeries(ChartView.SeriesTypeScatter, labels[idx]+"scatter", solutionPositionXAxis);
180+
scatter.color = colors[idx];
181+
scatter.markerSize = 5.0;
182+
scatter.axisY = solutionPositionYAxis;
178183
var line = solutionPositionChart.createSeries(ChartView.SeriesTypeLine, labels[idx], solutionPositionXAxis);
179184
line.color = colors[idx];
180-
line.width = 2;
185+
line.width = 0.2;
181186
line.axisY = solutionPositionYAxis;
182187
// line.useOpenGL = true; // [CPP-93] Invesigate usage of `useOpenGL` in plots
188+
// scatter.useOpenGL = true; // [CPP-93] Invesigate usage of `useOpenGL` in plots
183189
lines.push(line);
190+
scatters.push(scatter);
184191
}
185192
}
186-
187-
solutionPositionPoints.fill_series(lines);
193+
194+
var combined = [lines, scatters];
195+
solutionPositionPoints.fill_series(combined);
188196
if (solutionPositionYAxis.min != solutionPositionPoints.lat_min_ || solutionPositionYAxis.max != solutionPositionPoints.lat_max_) {
189197
solutionPositionYAxis.min = solutionPositionPoints.lat_min_;
190198
solutionPositionYAxis.max = solutionPositionPoints.lat_max_;

resources/SolutionTabComponents/SolutionTable.qml

Lines changed: 71 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// import "ContactModel" as ContactModel
22

33
import QtCharts 2.2
4-
import QtQuick 2.6
4+
import QtQuick 2.14
5+
import Qt.labs.qmlmodels 1.0
56
import QtQuick.Controls 2.12
67
import QtQuick.Layouts 1.15
78
import SwiftConsole 1.0
@@ -11,6 +12,8 @@ Item {
1112

1213
property variant keys: []
1314
property variant vals: []
15+
property variant table: []
16+
property variant columnWidths: [50, 50]
1417

1518
width: parent.width
1619
height: parent.height
@@ -30,104 +33,89 @@ Item {
3033
// anchors.left: trackingSignalsChart.left
3134
// anchors.bottomMargin: 85
3235
// anchors.leftMargin: 60
36+
3337
width: parent.width
3438
height: parent.height
3539

36-
RowLayout {
40+
ColumnLayout {
3741
id: solutionTableRowLayout
38-
42+
spacing: 0
3943
width: parent.width
4044
height: parent.height
41-
42-
ListView {
43-
id: solutionTableKeys
44-
width: parent.width / 2
45-
Layout.fillHeight: true
46-
spacing: 1
47-
model: keys
48-
delegate: keysDelegate
49-
focus: true
50-
Component {
51-
id: keysDelegate
52-
Rectangle {
53-
id: key
54-
border.color: "#000000"
55-
border.width: 1
56-
width: implicitWidth
57-
height: keyText.height
58-
Text {
59-
id: keyText
60-
text: modelData
61-
}
62-
63-
}
64-
45+
TableView {
46+
id: solutionTableElementHeaders
47+
// width: solutionTabBackground.width
48+
interactive: false
49+
Layout.minimumHeight: 20
50+
Layout.fillWidth: true
51+
Layout.leftMargin: 2
52+
Layout.rightMargin: 2
53+
Layout.bottomMargin: 0
54+
Layout.topMargin: 2
55+
// anchors.fill: parent
56+
columnSpacing: 0
57+
rowSpacing: 0
58+
clip: true
59+
// onWidthChanged: solutionTableElement.forceLayout()
60+
columnWidthProvider: function (column) { return columnWidths[column] }
61+
model: TableModel {
62+
TableModelColumn { display: "Item" }
63+
TableModelColumn { display: "Value" }
64+
65+
rows: [{"Item": "Item", "Value": "Value"}]
6566
}
6667

67-
header: Rectangle {
68-
id: kheader
69-
border.color: "#FFFFFF"
68+
delegate: Rectangle {
69+
id: textDelegate
70+
implicitHeight: 20
7071
border.width: 1
71-
width: implicitWidth
72-
height: kheaderText.height
72+
7373
Text {
74-
id: kheaderText
75-
text: "Item"
74+
id: rowText
75+
text: display
76+
anchors.centerIn: parent
77+
leftPadding: 2
7678
}
7779
}
7880
}
7981

80-
ListView {
81-
id: solutionTableVals
82-
82+
TableView {
83+
id: solutionTableElement
84+
// width: solutionTabBackground.width
8385
Layout.fillHeight: true
8486
Layout.fillWidth: true
85-
model: keys
86-
delegate: valsDelegate
87-
focus: true
88-
89-
Component {
90-
id: valsDelegate
91-
92-
Rectangle {
93-
id: val
94-
95-
z: 100
96-
width: implicitWidth
97-
height: valText.height
98-
border.color: "#000000"
99-
border.width: 4
100-
101-
Text {
102-
id: valText
103-
104-
text: modelData
105-
}
106-
107-
}
108-
87+
Layout.leftMargin: 2
88+
Layout.rightMargin: 2
89+
Layout.bottomMargin: 2
90+
Layout.topMargin: 0
91+
// anchors.fill: parent
92+
interactive: false
93+
columnSpacing: 0
94+
rowSpacing: 0
95+
clip: true
96+
97+
// contentWidth: solutionTab.width
98+
onWidthChanged: solutionTableElement.forceLayout()
99+
columnWidthProvider: function (column) { return columnWidths[column] }
100+
model: TableModel {
101+
TableModelColumn { display: "Item" }
102+
TableModelColumn { id: hello; display: "Value" }
103+
104+
rows: []
109105
}
110106

111-
// width: parent.width/2
112-
// height: parent.height
113-
header: Rectangle {
114-
id: vheader
115-
116-
width: implicitWidth
117-
height: vheaderText.height
118-
border.color: "#000000"
119-
border.width: 4
107+
delegate: Rectangle {
108+
id: textDelegate
109+
implicitHeight: 20
110+
border.width: 1
120111

121112
Text {
122-
id: vheaderText
123-
124-
text: "Value"
113+
id: rowText
114+
text: display
115+
leftPadding: 2
125116
}
126-
127117
}
128-
129118
}
130-
131119
}
132120
Timer {
133121
interval: 1000 / 10 // 10 Hz refresh
@@ -142,16 +130,17 @@ Item {
142130
return ;
143131

144132
var entries = solutionTableEntries.entries;
133+
var table_update = [];
145134
for (var idx in entries) {
146135
if (keys.length != entries.length) {
147-
keys.push(entries[idx][0]);
148-
vals.push(entries[idx][1]);
149-
solutionTableKeys.model = keys;
150-
} else {
151-
vals[idx] = entries[idx][1];
136+
table_update.push({"Item": entries[idx][0], "Value": entries[idx][1]});
152137
}
153138
}
154-
solutionTableVals.model = vals;
139+
solutionTableElement.model.rows = table_update;
140+
columnWidths = [120, solutionTableArea.width-120]
141+
solutionTableElement.forceLayout();
142+
solutionTableElementHeaders.forceLayout();
143+
155144
}
156145
}
157146
}

src/main/python/main.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,9 +257,11 @@ def set_points(self, points) -> None:
257257

258258
@Slot(list) # type: ignore
259259
def fill_series(self, series_list):
260-
for idx, series in enumerate(series_list):
261-
series.replace(self._points[idx])
262-
260+
lines = series_list[0]
261+
scatters = series_list[1]
262+
for idx, _ in enumerate(lines):
263+
lines[idx].replace(self._points[idx])
264+
scatters[idx].replace(self._points[idx])
263265

264266
class SolutionPositionModel(QObject): # pylint: disable=too-few-public-methods
265267
@Slot(SolutionPositionPoints) # type: ignore

0 commit comments

Comments
 (0)