/*
 * Main.fx
 *
 * Created on 8 Jul, 2009, 6:14:16 PM
 */

package draw;

import javafx.scene.Scene;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Path;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.LineTo;
import javafx.scene.paint.Color;
import javafx.scene.shape.StrokeLineCap;
import javafx.animation.transition.AnimationPath;
import javafx.animation.transition.OrientationType;
import javafx.animation.transition.PathTransition;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
import javafx.scene.shape.ClosePath;


/**
 @author Rakesh Menon
 */

var car : ImageView = ImageView {
    image: Image {
        url: "{__DIR__}car.png"
    }
}
var terrain : ImageView = ImageView {
    image: Image {
        url: "{__DIR__}terrain.jpg"
    }
}

var path = Path {
    elements: bind pathUtil.elements
    stroke: Color.BLACK
    strokeWidth: 20
    strokeLineCap: StrokeLineCap.ROUND
    opacity: 0.5
}
var stripe = Path {
    elements: bind path.elements
    stroke: Color.WHITE
    strokeWidth: 2
    strokeDashArray: 1020 ]
}

var pathUtil = PathUtil {
    
};

var pathTransition = PathTransition {
    duration: 10s
    node: car
    orientation: OrientationType.ORTHOGONAL_TO_TANGENT
    repeatCount: 1
};

var bgRect : Rectangle = Rectangle {

    width: bind bgRect.scene.width
    height: bind bgRect.scene.height
    fill: Color.TRANSPARENT
    
    onMousePressed: function(e) {

        // Reset
        delete pathUtil.elements;
        pathTransition.stop();

        insert MoveTo x: e.x  y: e.y into pathUtil.elements;
    }

    onMouseDragged: function(e) {
        insert LineTo x: e.x  y: e.y into pathUtil.elements;
    }

    onMouseReleased: function(e) {
        insert ClosePath { } into pathUtil.elements;
        pathUtil.save();
        doAnimation();
    }
}

function doAnimation() {
    if(sizeof path.elements <= 0) { return}
    pathTransition.path = AnimationPath.createFromPath(path);
    pathTransition.playFromStart();
}

var stage = Stage {
    title: "Terrain Race!"
    scene: Scene {
        content: terrain, bgRect, path, stripe, car ]
        width: 450
        height: 300
    }
    resizable: false
    visible: false
}

function run() {
    stage.visible = true;
    pathUtil.load();
    doAnimation();
}