From e1d2cf2238eaab7573720ee42c22cea3a1993e79 Mon Sep 17 00:00:00 2001 From: Renan Date: Thu, 25 Oct 2018 23:47:54 -0300 Subject: [PATCH] composed components --- lib/components/composed_component.dart | 59 ++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 lib/components/composed_component.dart diff --git a/lib/components/composed_component.dart b/lib/components/composed_component.dart new file mode 100644 index 000000000..8d03447bd --- /dev/null +++ b/lib/components/composed_component.dart @@ -0,0 +1,59 @@ + +import 'dart:ui'; + +import 'package:flame/components/component.dart'; +import 'package:flame/components/resizable.dart'; +import 'package:ordered_set/comparing.dart'; +import 'package:ordered_set/ordered_set.dart'; + + +typedef IterateOverComponents = void Function(Component component); + +abstract class ComposedComponent extends Component { + OrderedSet components = new OrderedSet(Comparing.on((c) => c.priority())); + + @override + render(Canvas canvas) { + canvas.save(); + components.forEach((comp) => renderComponent(canvas, comp)); + canvas.restore(); + } + + void renderComponent(Canvas canvas, Component c) { + c.render(canvas); + canvas.restore(); + canvas.save(); + } + + @override + void update(double t) { + components.forEach((c) => c.update(t)); + components.removeWhere((c) => c.destroy()); + } + + void add(Component c) { + this.components.add(c); + + if(this is Resizable){ + // first time resize + Resizable thisResizable = this as Resizable; + if (thisResizable.size != null) { + c.resize(thisResizable.size); + } + } + } + + void iterateOverComponents ( IterateOverComponents iterateOverComponentsCallback ){ + components.forEach(iterateOverComponentsCallback); + } + + @override + void resize(Size size) { + if(this is Resizable){ + Resizable thisResizable = this as Resizable; + thisResizable.size = size; + components.forEach((c) => c.resize(size)); + } + } + +} \ No newline at end of file