Skip to content

Commit 450c847

Browse files
authored
[backport] fixed aspect ratio in charts [CPP-939] (#1049)
1 parent 6c3d949 commit 450c847

File tree

1 file changed

+29
-11
lines changed

1 file changed

+29
-11
lines changed

resources/SolutionTabComponents/SolutionPositionTab.qml

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ Item {
149149
onClicked: {
150150
if (checked) {
151151
solutionZoomAllButton.checked = false;
152-
y_axis_half = Utils.spanBetweenValues(solutionPositionXAxis.max, solutionPositionXAxis.min) / 2;
153152
x_axis_half = Utils.spanBetweenValues(solutionPositionYAxis.max, solutionPositionYAxis.min) / 2;
153+
y_axis_half = Utils.spanBetweenValues(solutionPositionXAxis.max, solutionPositionXAxis.min) / 2;
154154
center_solution = true;
155155
zoom_all = false;
156156
} else {
@@ -225,23 +225,29 @@ Item {
225225
solutionPositionYAxis.freezeTicks();
226226
}
227227

228+
function fixAspectRatio() {
229+
const aspect_ratio = height / width;
230+
const x_range = Math.abs(solutionPositionXAxis.max - solutionPositionXAxis.min);
231+
const y_range = Math.abs(solutionPositionYAxis.max - solutionPositionYAxis.min);
232+
const range_diff = aspect_ratio * x_range - y_range;
233+
if (range_diff < 0) {
234+
const correction = Math.abs(range_diff / aspect_ratio / 2);
235+
solutionPositionXAxis.min -= correction;
236+
solutionPositionXAxis.max += correction;
237+
} else {
238+
const correction = Math.abs(range_diff / 2);
239+
solutionPositionYAxis.min -= correction;
240+
solutionPositionYAxis.max += correction;
241+
}
242+
}
243+
228244
// This function make the ticks on the x & y axes have the
229245
// same interval, and have them land on evenish numbers.
230246
// It also ensures the ranges of the two axes are the same.
231247
function setTicks() {
232248
const x_tick_interval = solutionPositionXAxis.getGoodTickInterval();
233249
const y_tick_interval = solutionPositionYAxis.getGoodTickInterval();
234250
const max_tick_interval = Math.max(x_tick_interval, y_tick_interval);
235-
const x_range = Math.abs(solutionPositionXAxis.max - solutionPositionXAxis.min);
236-
const y_range = Math.abs(solutionPositionYAxis.max - solutionPositionYAxis.min);
237-
const range_diff = Math.abs(x_range - y_range);
238-
if (x_range < y_range) {
239-
solutionPositionXAxis.min -= range_diff / 2;
240-
solutionPositionXAxis.max += range_diff / 2;
241-
} else {
242-
solutionPositionYAxis.min -= range_diff / 2;
243-
solutionPositionYAxis.max += range_diff / 2;
244-
}
245251
solutionPositionXAxis.setGoodTicks(max_tick_interval);
246252
solutionPositionYAxis.setGoodTicks(max_tick_interval);
247253
}
@@ -254,6 +260,7 @@ Item {
254260
solutionPositionXAxis.min = orig_lon_min;
255261
solutionPositionYAxis.max = orig_lat_max;
256262
solutionPositionYAxis.min = orig_lat_min;
263+
solutionPositionChart.fixAspectRatio();
257264
// update ticks
258265
solutionPositionChart.setTicks();
259266
}
@@ -268,6 +275,7 @@ Item {
268275
solutionPositionYAxis.max = cur_solution.y + y_axis_half;
269276
solutionPositionYAxis.min = cur_solution.y - y_axis_half;
270277
}
278+
solutionPositionChart.fixAspectRatio();
271279
// update ticks
272280
solutionPositionChart.setTicks();
273281
}
@@ -290,6 +298,16 @@ Item {
290298
zoom_all = false;
291299
}
292300

301+
onWidthChanged: {
302+
solutionPositionChart.freezeTicks();
303+
solutionPositionChart.fixAspectRatio();
304+
solutionPositionChart.setTicks();
305+
}
306+
onHeightChanged: {
307+
solutionPositionChart.freezeTicks();
308+
solutionPositionChart.fixAspectRatio();
309+
solutionPositionChart.setTicks();
310+
}
293311
Layout.preferredWidth: parent.width
294312
Layout.preferredHeight: parent.height - Constants.commonChart.heightOffset
295313
Layout.alignment: Qt.AlignBottom

0 commit comments

Comments
 (0)