import QtQml 2.2
import QtQuick 2.0
import QtLocation 5.3

MapQuickItem {
    id: root

    width: 15
    height: 15
    anchorPoint.x: width/2
    anchorPoint.y: height/2

    property color primaryColor: "orange"
    property color secondaryColor: "lightblue"

    property real centerWidth: width / 2
    property real centerHeight: height / 2
    property real radius: Math.min(canvas.width, canvas.height) / 2

    property real minimumValue: 0
    property real maximumValue: 100
    property real currentValue: 33

    // this is the angle that splits the circle in two arcs
    // first arc is drawn from 0 radians to angle radians
    // second arc is angle radians to 2*PI radians
    property real angle: (currentValue - minimumValue) / (maximumValue - minimumValue) * 2 * Math.PI

    // we want both circle to start / end at 12 o'clock
    // without this offset we would start / end at 9 o'clock
    property real angleOffset: -Math.PI / 2

    property string text: ""

    signal clicked()

    onPrimaryColorChanged: canvas.requestPaint()
    onSecondaryColorChanged: canvas.requestPaint()
    onMinimumValueChanged: canvas.requestPaint()
    onMaximumValueChanged: canvas.requestPaint()
    onCurrentValueChanged: canvas.requestPaint()

    // draws two arcs (portion of a circle)
    // fills the circle with a lighter secondary color
    // when pressed
    sourceItem: Canvas {
        id: canvas
        width: root.width
        height: root.height
        antialiasing: true

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

            ctx.clearRect(0, 0, canvas.width, canvas.height);

            // fills the mouse area when pressed
            // the fill color is a lighter version of the
            // secondary color

            if (mouseArea.pressed) {
                ctx.beginPath();
                ctx.lineWidth = 1;
                ctx.fillStyle = Qt.lighter(root.secondaryColor, 1.25);
                ctx.arc(root.centerWidth,
                        root.centerHeight,
                        root.radius,
                        0,
                        2*Math.PI);
                ctx.fill();
            }

            // First, thinner arc
            // From angle to 2*PI

            ctx.beginPath();
            ctx.lineWidth = 1;
            ctx.strokeStyle = primaryColor;
            ctx.arc(root.centerWidth,
                    root.centerHeight,
                    root.radius,
                    angleOffset + root.angle,
                    angleOffset + 2*Math.PI);
            ctx.stroke();


            // Second, thicker arc
            // From 0 to angle

            ctx.beginPath();
            ctx.lineWidth = 1;
            ctx.strokeStyle = root.secondaryColor;
            ctx.arc(root.centerWidth,
                    root.centerHeight,
                    root.radius,
                    root.angleOffset,
                    root.angleOffset + root.angle);
            ctx.stroke();

            ctx.restore();
        }

        Text {
            anchors.centerIn: parent

            text: root.text
            color: root.primaryColor
        }

        MouseArea {
            id: mouseArea

            anchors.fill: parent
            onClicked: root.clicked()
            onPressedChanged: canvas.requestPaint()
        }
    }
}