gridpaper.dart 2.61 KB
Newer Older
1 2 3 4 5 6 7 8 9
// Copyright 2015 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 'package:flutter/rendering.dart';

import 'basic.dart';
import 'framework.dart';

10 11 12
class _GridPaperPainter extends CustomPainter {
  const _GridPaperPainter({
    this.color,
Ian Hickson's avatar
Ian Hickson committed
13 14 15
    this.interval,
    this.divisions,
    this.subDivisions
16 17 18 19
  });

  final Color color;
  final double interval;
Ian Hickson's avatar
Ian Hickson committed
20 21
  final int divisions;
  final int subDivisions;
22

23
  @override
24 25 26
  void paint(Canvas canvas, Size size) {
    Paint linePaint = new Paint()
      ..color = color;
Ian Hickson's avatar
Ian Hickson committed
27 28 29
    double allDivisions = (divisions * subDivisions).toDouble();
    for (double x = 0.0; x <= size.width; x += interval / allDivisions) {
      linePaint.strokeWidth = (x % interval == 0.0) ? 1.0 : (x % (interval / subDivisions) == 0.0) ? 0.5: 0.25;
30 31
      canvas.drawLine(new Point(x, 0.0), new Point(x, size.height), linePaint);
    }
Ian Hickson's avatar
Ian Hickson committed
32 33
    for (double y = 0.0; y <= size.height; y += interval / allDivisions) {
      linePaint.strokeWidth = (y % interval == 0.0) ? 1.0 : (y % (interval / subDivisions) == 0.0) ? 0.5: 0.25;
34 35 36 37
      canvas.drawLine(new Point(0.0, y), new Point(size.width, y), linePaint);
    }
  }

38
  @override
39 40
  bool shouldRepaint(_GridPaperPainter oldPainter) {
    return oldPainter.color != color
Ian Hickson's avatar
Ian Hickson committed
41 42 43
        || oldPainter.interval != interval
        || oldPainter.divisions != divisions
        || oldPainter.subDivisions != subDivisions;
44
  }
Ian Hickson's avatar
Ian Hickson committed
45

46
  @override
Ian Hickson's avatar
Ian Hickson committed
47
  bool hitTest(Point position) => false;
48 49
}

50 51 52
/// A widget that draws a rectilinear grid of 1px wide lines.
///
/// Useful with a [Stack] for visualizing your layout along a grid.
53
class GridPaper extends StatelessWidget {
54
  /// Creates a widget that draws a rectilinear grid of 1px wide lines.
55 56
  GridPaper({
    Key key,
Ian Hickson's avatar
Ian Hickson committed
57 58 59 60 61
    this.color: const Color(0x7FC3E8F3),
    this.interval: 100.0,
    this.divisions: 2,
    this.subDivisions: 5,
    this.child
62 63
  }) : super(key: key);

64
  /// The color to draw the lines in the grid.
65
  final Color color;
66 67

  /// The distance between the primary lines in the grid, in logical pixels.
68
  final double interval;
69 70

  /// The number of major divisions within each primary grid cell.
Ian Hickson's avatar
Ian Hickson committed
71
  final int divisions;
72 73

  /// The number of minor divisions within each major division.
Ian Hickson's avatar
Ian Hickson committed
74
  final int subDivisions;
75

76
  /// The widget below this widget in the tree.
Ian Hickson's avatar
Ian Hickson committed
77
  final Widget child;
78

79
  @override
80
  Widget build(BuildContext context) {
Ian Hickson's avatar
Ian Hickson committed
81 82 83 84 85 86 87 88
    return new CustomPaint(
      foregroundPainter: new _GridPaperPainter(
        color: color,
        interval: interval,
        divisions: divisions,
        subDivisions: subDivisions
      ),
      child: child
89 90 91
    );
  }
}