diff --git a/example/lib/app.dart b/example/lib/app.dart index f595d0a..c7e7791 100644 --- a/example/lib/app.dart +++ b/example/lib/app.dart @@ -10,7 +10,7 @@ class App extends StatefulWidget { } class _AppState extends State { - final CanvasController controller = CanvasController(); + final CanvasController controller = CanvasController(debug: true); @override void initState() { diff --git a/lib/core/controller.dart b/lib/core/controller.dart index 47b871c..10166f9 100644 --- a/lib/core/controller.dart +++ b/lib/core/controller.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:infinite_lazy_2d_grid/utils/conversions.dart'; +import 'package:infinite_lazy_2d_grid/utils/styles.dart'; // ------------------------------ Public Types ------------------------------- @@ -25,6 +26,12 @@ class CanvasController with ChangeNotifier { int _nextId = 0; // surely we won't run out of IDs, Clueless Offset _gsTopLeftOffset = Offset.zero; final Map _children = {}; // int for IDs + bool debug; + + CanvasController({this.debug = false}); + + // -------------------- getters -------------------- + Offset get offset => _gsTopLeftOffset; // -------------------- public functions -------------------- @@ -70,9 +77,38 @@ class CanvasController with ChangeNotifier { } List<(Offset, Widget)> widgetsWithScreenPositions() { - return _children.values.map((item) { + return _children.entries.map((entry) { + final item = entry.value; final ssPosition = gsToSs(item.gsPosition, _gsTopLeftOffset); - return (ssPosition, item.builder()); + var child = item.builder(); + if (debug) child = _Debug(id: entry.key, gs: item.gsPosition, ss: ssPosition, child: child); + return (ssPosition, child); }).toList(); } } + +class _Debug extends StatelessWidget { + final int id; + final Offset gs, ss; + final Widget child; + + const _Debug({required this.id, required this.gs, required this.ss, required this.child}); + + @override + Widget build(BuildContext context) { + return Stack( + clipBehavior: Clip.none, + children: [ + child, + Positioned( + left: 0, + bottom: -60, + child: Text( + 'ID: $id\nGS:(${gs.dx.toInt()},${gs.dy.toInt()})\nSS:(${ss.dx.toInt()},${ss.dy.toInt()})', + style: monospaceStyle, + ), + ), + ], + ); + } +} diff --git a/lib/core/render.dart b/lib/core/render.dart index 9169a99..f5111ec 100644 --- a/lib/core/render.dart +++ b/lib/core/render.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:infinite_lazy_2d_grid/core/controller.dart'; +import 'package:infinite_lazy_2d_grid/utils/offset_extensions.dart'; +import 'package:infinite_lazy_2d_grid/utils/styles.dart'; import 'background.dart'; @@ -28,11 +30,26 @@ class CanvasView extends StatelessWidget { final childrenWithPositions = controller.widgetsWithScreenPositions(); final ssPositions = childrenWithPositions.map((e) => e.$1).toList(); final children = childrenWithPositions.map((e) => e.$2).toList(); - return _CanvasRenderObject( + final canvas = _CanvasRenderObject( canvasBackground: canvasBackground, ssPositions: ssPositions, children: children, ); + + if (controller.debug) { + return Stack( + children: [ + canvas, + Positioned( + top: 16, + left: 16, + child: Text('Offset: ${controller.offset.coord()}', style: monospaceStyle), + ), + ], + ); + } else { + return canvas; + } }, ), ), diff --git a/lib/utils/offset_extensions.dart b/lib/utils/offset_extensions.dart index 7f012cd..c72a28e 100644 --- a/lib/utils/offset_extensions.dart +++ b/lib/utils/offset_extensions.dart @@ -10,4 +10,8 @@ extension OffsetCartesionOps on Offset { Offset operator -(Offset other) { return Offset(dx - other.dx, dy - other.dy); } + + String coord() { + return '(${dx.toStringAsFixed(2)}, ${dy.toStringAsFixed(2)})'; + } } diff --git a/lib/utils/styles.dart b/lib/utils/styles.dart new file mode 100644 index 0000000..4d7b54b --- /dev/null +++ b/lib/utils/styles.dart @@ -0,0 +1,8 @@ +import 'package:flutter/material.dart'; + +final TextStyle monospaceStyle = TextStyle( + color: Colors.black, + fontSize: 14, + fontWeight: FontWeight.bold, + fontFamily: 'monospace', +);