subsurface/mobile-widgets/qml/StatisticsPage.qml
Dirk Hohndel 35f1b9e204 mobile/statistics: force redraw after rotation
Sometimes (and it's unclear why that happens) after rotation the stats
widget is blank. Setting the first variable back to itself appears
enough to ensure that the statistics view is redrawn. Try to do that
programatically after a short delay.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2021-01-19 12:42:48 -08:00

235 lines
6.2 KiB
QML

// SPDX-License-Identifier: GPL-2.0
import QtQuick 2.6
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.2
import org.subsurfacedivelog.mobile 1.0
import org.kde.kirigami 2.4 as Kirigami
Kirigami.Page {
id: statisticsPage
objectName: "StatisticsPage"
title: qsTr("Statistics")
leftPadding: 0
topPadding: 0
rightPadding: 0
bottomPadding: 0
width: rootItem.width
implicitWidth: rootItem.width
background: Rectangle { color: subsurfaceTheme.backgroundColor }
property bool wide: width > rootItem.height
StatsManager {
id: statsManager
}
ChartListModel {
id: chartListModel
}
onVisibleChanged: {
if (visible)
statsManager.doit()
}
onWidthChanged: {
if (visible) {
statsManager.doit()
}
}
onWideChanged: {
// so this means we rotated the device - and sometimes after rotation
// the stats widget is empty.
rotationRedrawTrigger.start()
}
Timer {
// wait .5 seconds (so the OS rotation animation has a chance to run) and then set var1 again
// to its current value, which appears to be enough to ensure that the chart is drawn again
id: rotationRedrawTrigger
interval: 500
onTriggered: statsManager.var1Changed(i1.var1currentIndex)
}
Component {
id: chartListDelegate
Kirigami.AbstractListItem {
id: chartListDelegateItem
height: isHeader ? 1 + 8 * Kirigami.Units.smallSpacing : 11 * Kirigami.Units.smallSpacing // delegateInnerItem.height
onClicked: {
if (!isHeader) {
chartTypePopup.close()
statsManager.setChart(id)
}
}
Item {
id: chartListDelegateInnerItem
Row {
height: childrenRect.height
spacing: Kirigami.Units.smallSpacing
Kirigami.Icon {
id: chartIcon
source: icon
width: iconSize !== undefined ? iconSize.width : 0
}
Label {
text: chartName
font.bold: isHeader
color: subsurfaceTheme.textColor
}
}
}
}
}
Popup {
id: chartTypePopup
x: Kirigami.Units.gridUnit * 2
y: Kirigami.Units.gridUnit
width: Math.min(Kirigami.Units.gridUnit * 12, statisticsPage.width * 0.6)
height: Math.min(statisticsPage.height - 3 * Kirigami.Units.gridUnit, chartListModel.count * Kirigami.Units.gridUnit * 2.75)
modal: true
focus: true
clip: true
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
ListView {
id: chartTypes
model: chartListModel
anchors.fill: parent
delegate: chartListDelegate
}
}
GridLayout {
anchors.fill: parent
ColumnLayout {
id: i1
Layout.column: 0
Layout.row: 0
Layout.leftMargin: Kirigami.Units.smallSpacing
Layout.topMargin: Kirigami.Units.smallSpacing
property alias var1currentIndex: var1.currentIndex
TemplateLabelSmall {
text: qsTr("Base variable")
}
TemplateSlimComboBox {
id: var1
model: statsManager.var1List
currentIndex: statsManager.var1Index;
onCurrentIndexChanged: {
statsManager.var1Changed(currentIndex)
}
}
}
ColumnLayout {
id: i2
Layout.column: wide ? 0 : 1
Layout.row: wide ? 1 : 0
Layout.leftMargin: Kirigami.Units.smallSpacing
TemplateLabelSmall {
text: qsTr("Binning")
}
TemplateSlimComboBox {
id: var1Binner
model: statsManager.binner1List
currentIndex: statsManager.binner1Index;
onCurrentIndexChanged: {
statsManager.var1BinnerChanged(currentIndex)
}
}
}
ColumnLayout {
id: i3
Layout.column: wide ? 0 : 0
Layout.row: wide ? 2 : 1
Layout.leftMargin: Kirigami.Units.smallSpacing
TemplateLabelSmall {
text: qsTr("Data")
}
TemplateSlimComboBox {
id: var2
model: statsManager.var2List
currentIndex: statsManager.var2Index;
Layout.fillWidth: false
onCurrentIndexChanged: {
statsManager.var2Changed(currentIndex)
}
}
}
ColumnLayout {
id: i4
Layout.column: wide ? 0 : 1
Layout.row: wide ? 3 : 1
Layout.leftMargin: Kirigami.Units.smallSpacing
TemplateLabelSmall {
text: qsTr("Binning")
}
TemplateSlimComboBox {
id: var2Binner
model: statsManager.binner2List
currentIndex: statsManager.binner2Index;
Layout.fillWidth: false
onCurrentIndexChanged: {
statsManager.var2BinnerChanged(currentIndex)
}
}
}
ColumnLayout {
id: i5
Layout.column: wide ? 0 : 0
Layout.row: wide ? 4 : 2
Layout.leftMargin: Kirigami.Units.smallSpacing
TemplateLabelSmall {
text: qsTr("Operation")
}
TemplateSlimComboBox {
id: var2Operation
model: statsManager.operation2List
currentIndex: statsManager.operation2Index;
Layout.fillWidth: false
onCurrentIndexChanged: {
statsManager.var2OperationChanged(currentIndex)
}
}
}
Button {
id: chartTypeButton
Layout.column: wide ? 0 : 1
Layout.row: wide ? 5 : 2
Layout.leftMargin: Kirigami.Units.smallSpacing
Layout.topMargin: Kirigami.Units.largeSpacing
Layout.preferredHeight: Kirigami.Units.gridUnit * 2
Layout.preferredWidth: Kirigami.Units.gridUnit * 8
background: Rectangle {
color: chartTypeButton.pressed ? subsurfaceTheme.darkerPrimaryColor : subsurfaceTheme.primaryColor
antialiasing: true
radius: Kirigami.Units.smallSpacing * 2
height: Kirigami.Units.gridUnit * 2
}
contentItem: Text {
verticalAlignment: Qt.AlignVCenter
horizontalAlignment: Qt.AlignHCenter
color: subsurfaceTheme.primaryTextColor
text: qsTr("Chart type")
}
onClicked: chartTypePopup.open()
}
Item {
Layout.column: wide ? 0 : 2
Layout.row: wide ? 6 : 2
Layout.preferredHeight: wide ? parent.height - Kirigami.Units.gridUnit * 16 : Kirigami.Units.gridUnit
Layout.fillWidth: wide ? false : true
// just used for spacing
}
StatsView {
Layout.column: wide ? 1 : 0
Layout.row: wide ? 0 : 3
Layout.columnSpan: wide ? 1 : 3
Layout.rowSpan: wide ? 7 : 1
id: statsView
Layout.margins: Kirigami.Units.smallSpacing
Layout.fillWidth: true
Layout.fillHeight: true
Layout.maximumHeight: wide ? statisticsPage.height - 2 * Kirigami.Units.gridUnit :
statisticsPage.height - 2 * Kirigami.Units.gridUnit - i4.height
Layout.maximumWidth: wide ? statisticsPage.width - 2 * Kirigami.Units.gridUnit - i4.width :
statisticsPage.width - 2 * Kirigami.Units.smallSpacing
}
}
Component.onCompleted: {
statsManager.init(statsView, chartListModel)
}
}