// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'package:flutter_sprites/flutter_sprites.dart';

class DrawingDemo extends StatefulWidget {
  static const String routeName = '/drawing';

  @override
  _DrawingDemoState createState() => new _DrawingDemoState();
}

class _DrawingDemoState extends State<DrawingDemo> {
  _LineDrawingNode _rootNode;
  ImageMap _images;

  Future<Null> _loadAssets(AssetBundle bundle) async {
    _images = new ImageMap(bundle);
    await _images.load(<String>[
      'packages/flutter_gallery_assets/fancylines.png'
    ]);
  }

  @override
  void initState() {
    super.initState();
    _loadAssets(DefaultAssetBundle.of(context)).then((_) {
      setState(() {
        _rootNode = new _LineDrawingNode(_images);
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    Widget body;
    if (_rootNode == null) {
      body = new Center(
        child: new CircularProgressIndicator()
      );
    } else {
      body = new SpriteWidget(_rootNode, SpriteBoxTransformMode.nativePoints);
    }

    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Fancy lines')
      ),
      body: body
    );
  }
}

class _LineDrawingNode extends NodeWithSize {
  _LineDrawingNode(this._images) : super(const Size(1024.0, 1024.0)) {
    userInteractionEnabled = true;
  }

  final ImageMap _images;
  EffectLine _currentLine;

  @override
  bool handleEvent(SpriteBoxEvent event) {
    if (event.type == PointerDownEvent) {
      _currentLine = new EffectLine(
        texture: new Texture(_images['packages/flutter_gallery_assets/fancylines.png']),
        colorSequence: new ColorSequence.fromStartAndEndColor(Colors.purple[500], Colors.purple[600]),
        fadeAfterDelay: 3.0,
        fadeDuration: 1.0
      );
      _currentLine.addPoint(event.boxPosition);
      addChild(_currentLine);
    } else if (event.type == PointerMoveEvent) {
      _currentLine.addPoint(event.boxPosition);
    }

    return true;
  }
}