Axis Handling

// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

import QtQuick
import QtQuick.Controls
import QtGraphs
import AxisHandling

Item {
    id: axisFormattingView

    required property bool portraitMode

    Data {
        id: seriesData
    }

    Theme3D {
        id: themePrimaryColors
        type: Theme3D.Theme.PrimaryColors
        font.family: "Lucida Handwriting"
        font.pointSize: 40
    }

    ValueAxis3D {
        id: dateAxis
        formatter: CustomFormatter {
            originDate: "2023-01-01"
            selectionFormat: "yyyy-MM-dd HH:mm:ss"
        }
        subSegmentCount: 2
        labelFormat: "yyyy-MM-dd"
        min: 0
        max: 14
    }

    ValueAxis3D {
        id: logAxis
        formatter: LogValueAxis3DFormatter {
            id: logAxisFormatter
            base: 10
            autoSubGrid: true
            showEdgeLabels: true
        }
        labelFormat: "%.2f"
    }

    ValueAxis3D {
        id: linearAxis
        labelFormat: "%.2f"
        min: 0
        max: 500
    }

    ValueAxis3D {
        id: valueAxis
        segmentCount: 5
        subSegmentCount: 2
        labelFormat: "%.2f"
        min: 0
        max: 10
    }

    Scatter3D {
        id: scatterGraph
        anchors.top: exitButton.bottom
        anchors.bottom: parent.bottom
        width: parent.width
        theme: themePrimaryColors
        shadowQuality: AbstractGraph3D.ShadowQuality.SoftMedium
        cameraPreset: AbstractGraph3D.CameraPreset.IsometricRight
        axisZ: valueAxis
        axisY: logAxis
        axisX: dateAxis

        Scatter3DSeries {
            id: scatterSeries
            itemLabelFormat: "@xLabel - (@yLabel, @zLabel)"
            meshSmooth: true
            ItemModelScatterDataProxy {
                itemModel: seriesData.model
                xPosRole: "xPos"
                yPosRole: "yPos"
                zPosRole: "zPos"
            }
        }
    }

    Button {
        id: yAxisBaseChange
        width: axisFormattingView.portraitMode ? parent.width : parent.width / 3
        anchors.left: parent.left
        anchors.top: parent.top
        state: "enabled"
        onClicked: {
            if (logAxisFormatter.base === 10)
                logAxisFormatter.base = 0;
            else if (logAxisFormatter.base === 2)
                logAxisFormatter.base = 10;
            else
                logAxisFormatter.base = 2;
        }
        states: [
            State {
                name: "enabled"
                PropertyChanges {
                    target: yAxisBaseChange
                    text: "Y-axis log base: " + logAxisFormatter.base
                    enabled: true
                }
            },
            State {
                name: "disabled"
                PropertyChanges {
                    target: yAxisBaseChange
                    text: "Y-axis linear"
                    enabled: false
                }
            }
        ]
    }

    Button {
        id: yAxisToggle
        width: axisFormattingView.portraitMode ? parent.width : parent.width / 3
        anchors.left: axisFormattingView.portraitMode ? parent.left : yAxisBaseChange.right
        anchors.top: axisFormattingView.portraitMode ? yAxisBaseChange.bottom : parent.top
        text: "Toggle Y-axis"
        onClicked: {
            if (scatterGraph.axisY == linearAxis) {
                scatterGraph.axisY = logAxis;
                yAxisBaseChange.state = "enabled";
            } else {
                scatterGraph.axisY = linearAxis;
                yAxisBaseChange.state = "disabled";
            }
        }
    }

    Button {
        id: exitButton
        width: axisFormattingView.portraitMode ? parent.width : parent.width / 3
        anchors.left: axisFormattingView.portraitMode ? parent.left : yAxisToggle.right
        anchors.top: axisFormattingView.portraitMode ? yAxisToggle.bottom : parent.top
        text: "Quit"
        onClicked: Qt.quit();
    }
}