/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Quick Extras module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

import QtQuick 2.2
import QtQuick.Controls.Styles 1.4 as Base
import QtQuick.Controls.Styles.Flat 1.0
import QtQuick.Extras.Private 1.0
import QtQuick.Extras.Private.CppUtils 1.1

Base.CircularGaugeStyle {
    id: circularGaugeStyle

    tickmarkInset: __thickArcTickmarklessMargin + __thickArcLineWidth / 2 - __tickmarkLength / 2
    minorTickmarkInset: __thickArcTickmarklessMargin + __thickArcLineWidth / 2 - (__tickmarkLength / 2) / 2
    labelInset: Math.max(textMetrics.width, textMetrics.height) / 2

    // A stroked arc starts losing its shape when it is very thick, so prevent that from happening.
    readonly property real __thickArcLineWidth: Math.min(22 * FlatStyle.scaleFactor, Math.round(outerRadius * 0.2))
    readonly property real __thickArcTickmarklessMargin: labelInset * 2
    readonly property real __tickmarkLength: __thickArcLineWidth * 0.5
    readonly property real __tickmarkWidth: FlatStyle.onePixel
    readonly property real __fontSize: Math.max(6, __protectedScope.toPixels(0.12))
    // TODO: add this to Utils or something; it's not specific to this control
    readonly property real __antialiasingAdjustment: FlatStyle.onePixel

    Text {
        id: textMetrics
        font.pixelSize: __fontSize
        text: control.maximumValue.toFixed(0)
        visible: false
    }

    background: Item {
        implicitWidth: Math.round(160 * FlatStyle.scaleFactor)
        implicitHeight: Math.round(160 * FlatStyle.scaleFactor)

        readonly property real thinArcLineWidth: FlatStyle.onePixel
        readonly property bool tickmarklessVariant: false
        readonly property real arcDistance: thinArcLineWidth * 3

        Connections {
            target: control
            function onValueChanged() { thickArc.requestPaint() }
            function onMinimumValueChanged() { thickArc.requestPaint() }
            function onMaximumValueChanged() { thickArc.requestPaint() }
            function onEnabledChanged() {
                thickArc.requestPaint();
                thinArc.requestPaint();
            }
        }

        // TODO: test performance of this on the Pi
        Canvas {
            id: thickArc
            anchors.fill: parent
            anchors.margins: Math.floor(tickmarklessVariant ? arcDistance : __thickArcTickmarklessMargin)

            onPaint: {
                var ctx = getContext("2d");
                ctx.reset();

                ctx.lineWidth = __thickArcLineWidth;
                var radius = Math.floor(width / 2 - ctx.lineWidth / 2 - __antialiasingAdjustment);
                if (radius < 0)
                    return;

                ctx.beginPath();
                ctx.globalAlpha = control.enabled ? 1 : 0.2;
                ctx.strokeStyle = control.enabled ? FlatStyle.styleColor : FlatStyle.disabledColor;
                var startAngle = MathUtils.degToRad(minimumValueAngle - 90);
                var endAngle = MathUtils.degToRad(needleRotation - 90);
                ctx.arc(Math.floor(width / 2), Math.floor(height / 2), radius, startAngle, endAngle, false);
                ctx.stroke();
            }
        }

        Canvas {
            id: thinArc
            anchors.fill: parent
            anchors.margins: Math.floor(tickmarklessVariant ? 0 : thickArc.anchors.margins + __thickArcLineWidth + arcDistance)

            onPaint: {
                var ctx = getContext("2d");
                ctx.reset();

                ctx.lineWidth = thinArcLineWidth;
                var radius = width / 2 - ctx.lineWidth / 2 - __antialiasingAdjustment;
                if (radius < 0)
                    return;

                ctx.beginPath();
                ctx.globalAlpha = control.enabled ? 1 : 0.2;
                ctx.strokeStyle = control.enabled ? FlatStyle.styleColor : FlatStyle.disabledColor;
                var startAngle = MathUtils.degToRad(minimumValueAngle - 90);
                var endAngle = MathUtils.degToRad(maximumValueAngle - 90);
                ctx.arc(Math.floor(width / 2), Math.floor(height / 2), radius, startAngle, endAngle, false);
                ctx.stroke();
            }
        }
    }

    needle: null
    foreground: null

    tickmark: Rectangle {
        implicitWidth: __tickmarkWidth
        implicitHeight: __tickmarkLength
        antialiasing: true
        color: control.value < styleData.value || isEdgeTickmark ? (control.enabled ? FlatStyle.styleColor : FlatStyle.disabledColor) : FlatStyle.selectedTextColor
        opacity: control.value < styleData.value || isEdgeTickmark ? (control.enabled ? 1 : 0.2) : 0.5
        visible: (!isEdgeTickmark) || (control.value < styleData.value)
            || (styleData.value === control.minimumValue && control.value === control.minimumValue)

        readonly property bool isEdgeTickmark: styleData.value === control.minimumValue || styleData.value === control.maximumValue
    }

    minorTickmark: Rectangle {
        implicitWidth: __tickmarkWidth
        implicitHeight: __tickmarkLength / 2
        antialiasing: true
        color: control.enabled ? FlatStyle.styleColor : FlatStyle.disabledColor
        visible: control.value < styleData.value
        opacity: control.enabled ? 1 : 0.2
    }

    tickmarkLabel: Text {
        font.pixelSize: __fontSize
        text: styleData.value
        color: control.enabled ? FlatStyle.defaultTextColor : FlatStyle.disabledColor
        opacity: control.enabled ? 1 : FlatStyle.disabledOpacity
        antialiasing: true
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
    }
}
