Skip to content

Commit

Permalink
- change the selector function for the decorator
Browse files Browse the repository at this point in the history
- having a constant painter for the decorator
  • Loading branch information
MHerrmannSOLID committed Apr 11, 2023
1 parent 306ef15 commit d75d769
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 24 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import 'package:dynamic_timeline/dynamic_timeline.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

import '../widgets/widgets.dart';
import 'package:intl/intl.dart';

class ColoredWeeklyTimetable extends StatefulWidget {
const ColoredWeeklyTimetable({Key? key}) : super(key: key);
Expand Down Expand Up @@ -78,12 +77,18 @@ class _ColoredWeeklyTimetableState extends State<ColoredWeeklyTimetable> {
DynamicTimeline(
firstDateTime: DateTime(1970, 01, 01, 7),
lastDateTime: DateTime(1970, 01, 01, 22),
labelBuilder: (date) => Text(DateFormat('HH:mm').format(date),),
labelBuilder: (date) => Text(
DateFormat('HH:mm').format(date),
),
intervalDuration: const Duration(hours: 1),
crossAxisCount: 7,
intervalExtent: 50,
intervalPainters: [ColoredIntervalPainter.createVertical(),
IntervalDecorationPainter.createHorizontal()],
intervalPainters: [
ColoredIntervalPainter.createVertical(),
IntervalDecorationPainter.createHorizontal(
intervalSelector: (intervalIdx) => intervalIdx % 2 == 0 ,
)
],
//intervalPainters: [HorizontalIntervalPainter()],
items: items,
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,37 @@ import 'package:flutter/material.dart';
import 'interval_painter.dart';

class IntervalDecorationPainter extends IntervalPainter {
static IntervalDecorationPainter createHorizontal() =>
IntervalDecorationPainter._(_drawHorizontal, drawingAxis: Axis.horizontal);
static IntervalDecorationPainter createHorizontal(
{Paint? paint, bool Function(int intervalIdx)? intervalSelector}) =>
IntervalDecorationPainter._(
_drawHorizontal,
paint: paint,
intervalSelector: intervalSelector,
drawingAxis: Axis.horizontal,
);

static IntervalDecorationPainter createVertical() =>
IntervalDecorationPainter._(_drawVertical, drawingAxis: Axis.vertical);
static IntervalDecorationPainter createVertical(
{Paint? paint, bool Function(int intervalIdx)? intervalSelector}) =>
IntervalDecorationPainter._(
_drawVertical,
paint: paint,
intervalSelector: intervalSelector,
drawingAxis: Axis.vertical,
);

IntervalDecorationPainter._(this._linePainter, {required super.drawingAxis});
IntervalDecorationPainter._(this._linePainter,
{required super.drawingAxis, bool Function(int intervalIdx)? intervalSelector, Paint? paint})
: _intervalSelector = intervalSelector ?? ((intervalIdx) => true),
_paint = paint ?? (Paint()..color = Colors.black26);

final void Function(Canvas canvas, Rect drawingRegion, Paint paint) _linePainter;
final bool Function(int intervalIdx) _intervalSelector;
final Paint _paint;

@override
void paintCallback(Canvas canvas, Rect drawingRegion, int intervalIdx) {
_linePainter(canvas, drawingRegion, Paint()..color = Colors.black26);
if (!_intervalSelector(intervalIdx)) return;
_linePainter(canvas, drawingRegion, _paint);
}

static void _drawHorizontal(Canvas canvas, Rect drawingRegion, Paint paint) =>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import 'package:dynamic_timeline/src/rendering/painter/interval_painter/background_painter_data.dart';
import 'package:dynamic_timeline/dynamic_timeline.dart';
import 'package:flutter_test/flutter_test.dart';
import '../../../helpers/helpers.dart';
import 'package:flutter/material.dart';
import '../../../helpers/helpers.dart';
import 'package:shouldly/shouldly.dart';

class IntervalDecorationPainterTests {
static void run() {
group('Interval painter decoration tests', () {
test('Vertical decoration line gets painted correctly '
test(
'Vertical decoration line gets painted correctly '
'--> coordinates as expected from the painter data', () {
var canvas = _FakeCanvas();
var idp = IntervalDecorationPainter.createVertical();
Expand All @@ -22,16 +23,15 @@ class IntervalDecorationPainterTests {
);
idp.paint(canvas, Offset.zero);

canvas.getDrawLineCalls(0).p1.dx.should.be( 10);
canvas.getDrawLineCalls(0).p1.dy.should.be( 550);

canvas.getDrawLineCalls(0).p2.dx.should.be( 310);
canvas.getDrawLineCalls(0).p2.dy.should.be( 550);
canvas.getDrawLineCalls(0).p1.dx.should.be(10);
canvas.getDrawLineCalls(0).p1.dy.should.be(550);

canvas.getDrawLineCalls(0).p2.dx.should.be(310);
canvas.getDrawLineCalls(0).p2.dy.should.be(550);
});


test('Horizontal decoration line gets painted correctly '
test(
'Horizontal decoration line gets painted correctly '
'--> coordinates as expected from the painter data', () {
var canvas = _FakeCanvas();
var idp = IntervalDecorationPainter.createHorizontal();
Expand All @@ -45,13 +45,94 @@ class IntervalDecorationPainterTests {
);
idp.paint(canvas, Offset.zero);

canvas.getDrawLineCalls(0).p1.dx.should.be( 550);
canvas.getDrawLineCalls(0).p1.dy.should.be( 10);
canvas.getDrawLineCalls(0).p1.dx.should.be(550);
canvas.getDrawLineCalls(0).p1.dy.should.be(10);

canvas.getDrawLineCalls(0).p2.dx.should.be( 550);
canvas.getDrawLineCalls(0).p2.dy.should.be( 310);
canvas.getDrawLineCalls(0).p2.dx.should.be(550);
canvas.getDrawLineCalls(0).p2.dy.should.be(310);
});

test(
'Interval selector for even index validation for vertical decorator '
'--> for 3 intervals there are only 2 painted ', () {
var canvas = _FakeCanvas();
var idp = IntervalDecorationPainter.createHorizontal(
intervalSelector: (idx) => idx % 2 == 0,
);

idp.data = BackgroundPainterData(
crossAxisExtend: 300,
mainAxisExtend: 500,
mainAxisOffset: 50,
crossAxisOffset: 10,
numberOfIntervals: 3,
);
idp.paint(canvas, Offset.zero);

canvas.numDrawRectCalls.should.be(2);
});

test(
'Interval selector for odd index validation for horizontal decorator '
'--> for 3 intervals there are only 1 painted ', () {
var canvas = _FakeCanvas();
var idp = IntervalDecorationPainter.createHorizontal(
intervalSelector: (idx) => idx % 2 != 0,
);

idp.data = BackgroundPainterData(
crossAxisExtend: 300,
mainAxisExtend: 500,
mainAxisOffset: 50,
crossAxisOffset: 10,
numberOfIntervals: 3,
);
idp.paint(canvas, Offset.zero);

canvas.numDrawRectCalls.should.be(1);
});


test(
'Changing the decoration color to red on a horizontal decorator', () {
var canvas = _FakeCanvas();
var idp = IntervalDecorationPainter.createHorizontal(
intervalSelector: (idx) => idx % 2 != 0,
paint: Paint()..color = Colors.red,
);

idp.data = BackgroundPainterData(
crossAxisExtend: 300,
mainAxisExtend: 500,
mainAxisOffset: 50,
crossAxisOffset: 10,
numberOfIntervals: 3,
);
idp.paint(canvas, Offset.zero);

canvas.getDrawLineCalls(0).paint.color.should.be(Colors.red);
});

test(
'Changing the decoration color to green on a vertical decorator', () {
var canvas = _FakeCanvas();
var idp = IntervalDecorationPainter.createVertical(
paint: Paint()..color = Colors.green,
);

idp.data = BackgroundPainterData(
crossAxisExtend: 300,
mainAxisExtend: 500,
mainAxisOffset: 50,
crossAxisOffset: 10,
numberOfIntervals: 2,
);
idp.paint(canvas, Offset.zero);

canvas.getDrawLineCalls(0).paint.color.should.be(Colors.green);
canvas.getDrawLineCalls(1).paint.color.should.be(Colors.green);
});

});
}
}
Expand Down

0 comments on commit d75d769

Please sign in to comment.