rename + add docs
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:infinite_lazy_2d_grid/infinite_lazy_2d_grid.dart';
|
import 'package:infinite_lazy_grid/infinite_lazy_grid.dart';
|
||||||
|
|
||||||
import 'widgets/fps.dart';
|
import 'widgets/fps.dart';
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ class App extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _AppState extends State<App> {
|
class _AppState extends State<App> {
|
||||||
final CanvasController controller = CanvasController(debug: true);
|
final LazyCanvasController controller = LazyCanvasController(debug: true);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
@@ -53,7 +53,7 @@ class _AppState extends State<App> {
|
|||||||
),
|
),
|
||||||
body: Stack(
|
body: Stack(
|
||||||
children: [
|
children: [
|
||||||
CanvasView(controller: controller, canvasBackground: SingleColorBackround(Colors.white)),
|
LazyCanvas(controller: controller, canvasBackground: SingleColorBackround(Colors.white)),
|
||||||
Positioned(bottom: 64, left: 16, child: Fps()),
|
Positioned(bottom: 64, left: 16, child: Fps()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:example/app.dart';
|
import './app.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ packages:
|
|||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
infinite_lazy_2d_grid:
|
infinite_lazy_grid:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: ".."
|
path: ".."
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ dependencies:
|
|||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
cupertino_icons: ^1.0.8
|
cupertino_icons: ^1.0.8
|
||||||
infinite_lazy_2d_grid:
|
infinite_lazy_grid:
|
||||||
path: ..
|
path: ..
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import './render.dart';
|
||||||
|
|
||||||
|
/// Abstract definition for a [LazyCanvas] background.
|
||||||
abstract class CanvasBackground {
|
abstract class CanvasBackground {
|
||||||
/// the fill color of background
|
/// the fill color of background
|
||||||
final Color bgColor;
|
final Color bgColor;
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:infinite_lazy_2d_grid/utils/measure_size.dart';
|
import '../../utils/measure_size.dart';
|
||||||
import '../spatial_hashing.dart';
|
import '../spatial_hashing.dart';
|
||||||
import '../../utils/offset_extensions.dart';
|
import '../../utils/offset_extensions.dart';
|
||||||
import '../../utils/size_extensions.dart';
|
import '../../utils/size_extensions.dart';
|
||||||
import '../../utils/conversions.dart';
|
import '../../utils/conversions.dart';
|
||||||
import '../../utils/styles.dart';
|
import '../../utils/styles.dart';
|
||||||
|
import '../render.dart';
|
||||||
|
|
||||||
part 'debug.dart';
|
part 'debug.dart';
|
||||||
part 'types.dart';
|
part 'types.dart';
|
||||||
|
|
||||||
/// Every canvas view needs one and this handles the positioning logic
|
/// Controller for [LazyCanvas]
|
||||||
class CanvasController with ChangeNotifier {
|
class LazyCanvasController with ChangeNotifier {
|
||||||
int _nextId = 0; // surely we won't run out of IDs, Clueless
|
int _nextId = 0; // surely we won't run out of IDs, Clueless
|
||||||
Offset _gsTopLeftOffset = Offset.zero;
|
Offset _gsTopLeftOffset = Offset.zero;
|
||||||
Offset? _lastProcessedOffset;
|
Offset? _lastProcessedOffset;
|
||||||
@@ -30,7 +31,7 @@ class CanvasController with ChangeNotifier {
|
|||||||
|
|
||||||
bool debug;
|
bool debug;
|
||||||
|
|
||||||
CanvasController({this.debug = false, Offset? buildCacheExtent, Size hashCellSize = const Size(100, 100)})
|
LazyCanvasController({this.debug = false, Offset? buildCacheExtent, Size hashCellSize = const Size(100, 100)})
|
||||||
: _hashCellSize = hashCellSize,
|
: _hashCellSize = hashCellSize,
|
||||||
_buildCacheExtent = buildCacheExtent != null ? buildCacheExtent + Offset(50, 50) : null
|
_buildCacheExtent = buildCacheExtent != null ? buildCacheExtent + Offset(50, 50) : null
|
||||||
// only top left is considered so if a widget has long width, it'll not be rendered
|
// only top left is considered so if a widget has long width, it'll not be rendered
|
||||||
@@ -64,10 +65,12 @@ class CanvasController with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Called when a child widget's size changes.
|
||||||
void onChildSizeChange(int id, Size size) {
|
void onChildSizeChange(int id, Size size) {
|
||||||
_children[id]!.lastRenderedSize = size;
|
_children[id]!.lastRenderedSize = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the ticker provider for animations.
|
||||||
void setTickerProvider(TickerProvider ticker) {
|
void setTickerProvider(TickerProvider ticker) {
|
||||||
_ticker = ticker;
|
_ticker = ticker;
|
||||||
}
|
}
|
||||||
@@ -139,7 +142,7 @@ class CanvasController with ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Increment or decrement the scale by a delta value.
|
/// Increment or decrement the scale by an additive delta value.
|
||||||
void updateScalebyDelta(double delta) {
|
void updateScalebyDelta(double delta) {
|
||||||
final focalPoint = Offset(canvasSize.width / 2, canvasSize.height / 2);
|
final focalPoint = Offset(canvasSize.width / 2, canvasSize.height / 2);
|
||||||
final newScale = _scale + delta;
|
final newScale = _scale + delta;
|
||||||
@@ -259,6 +262,7 @@ class CanvasController with ChangeNotifier {
|
|||||||
|
|
||||||
// ==================== Animation ====================
|
// ==================== Animation ====================
|
||||||
|
|
||||||
|
/// Animate the canvas to a new offset and scale
|
||||||
Future<void> animateToOffsetAndScale({
|
Future<void> animateToOffsetAndScale({
|
||||||
required Offset offset,
|
required Offset offset,
|
||||||
required double scale,
|
required double scale,
|
||||||
|
|||||||
@@ -1,23 +1,24 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
import 'package:infinite_lazy_2d_grid/core/controller/controller.dart';
|
import '../utils/offset_extensions.dart';
|
||||||
import 'package:infinite_lazy_2d_grid/utils/offset_extensions.dart';
|
|
||||||
import 'package:infinite_lazy_2d_grid/utils/styles.dart';
|
|
||||||
|
|
||||||
|
import '../utils/styles.dart';
|
||||||
import 'background.dart';
|
import 'background.dart';
|
||||||
|
import 'controller/controller.dart';
|
||||||
|
|
||||||
/// An infinite canvas that places all the children at the specified positions.
|
/// An infinite canvas that places all the children at the specified positions.
|
||||||
class CanvasView extends StatefulWidget {
|
/// Needs a [LazyCanvasController] to control the canvas and a [CanvasBackground] to draw the background.
|
||||||
|
class LazyCanvas extends StatefulWidget {
|
||||||
final CanvasBackground canvasBackground;
|
final CanvasBackground canvasBackground;
|
||||||
final CanvasController controller;
|
final LazyCanvasController controller;
|
||||||
|
|
||||||
const CanvasView({required this.controller, required this.canvasBackground, super.key});
|
const LazyCanvas({required this.controller, required this.canvasBackground, super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<CanvasView> createState() => _CanvasViewState();
|
State<LazyCanvas> createState() => _LazyCanvasState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _CanvasViewState extends State<CanvasView> with TickerProviderStateMixin<CanvasView> {
|
class _LazyCanvasState extends State<LazyCanvas> with TickerProviderStateMixin<LazyCanvas> {
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ class PointData<T> {
|
|||||||
PointData(this.point, this.data);
|
PointData(this.point, this.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Data structure for spatial hashing to get widgets to be built quickly
|
||||||
|
/// based on their position in a 2D grid.
|
||||||
class SpatialHashing<T> {
|
class SpatialHashing<T> {
|
||||||
final Size cellSize;
|
final Size cellSize;
|
||||||
final HashMap<Point, T> _pointData = HashMap<Point, T>();
|
final HashMap<Point, T> _pointData = HashMap<Point, T>();
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
name: infinite_lazy_2d_grid
|
name: infinite_lazy_grid
|
||||||
description: "A new Flutter package project."
|
description: "A new Flutter package project."
|
||||||
version: 0.0.1
|
version: 0.0.1
|
||||||
homepage:
|
homepage:
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:infinite_lazy_2d_grid/core/render.dart';
|
import 'package:infinite_lazy_grid/infinite_lazy_grid.dart';
|
||||||
import 'package:infinite_lazy_2d_grid/core/controller/controller.dart';
|
|
||||||
import 'package:infinite_lazy_2d_grid/core/background.dart';
|
|
||||||
|
|
||||||
class TestChild extends StatelessWidget {
|
class TestChild extends StatelessWidget {
|
||||||
final int index;
|
final int index;
|
||||||
@@ -15,14 +13,14 @@ class TestChild extends StatelessWidget {
|
|||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
testWidgets('CanvasView renders only visible children and reduces count on zoom out', (WidgetTester tester) async {
|
testWidgets('CanvasView renders only visible children and reduces count on zoom out', (WidgetTester tester) async {
|
||||||
final controller = CanvasController(debug: true);
|
final controller = LazyCanvasController(debug: true);
|
||||||
for (int i = 0; i < 10000; i++) {
|
for (int i = 0; i < 10000; i++) {
|
||||||
controller.addChild(Offset((i % 80) * 100.0, (i ~/ 80) * 100.0), (_) => TestChild(index: i));
|
controller.addChild(Offset((i % 80) * 100.0, (i ~/ 80) * 100.0), (_) => TestChild(index: i));
|
||||||
}
|
}
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
MaterialApp(
|
MaterialApp(
|
||||||
home: Scaffold(
|
home: Scaffold(
|
||||||
body: CanvasView(controller: controller, canvasBackground: SingleColorBackround(Colors.white)),
|
body: LazyCanvas(controller: controller, canvasBackground: SingleColorBackround(Colors.white)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -46,18 +44,18 @@ void main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('CanvasView scales as expected', (WidgetTester tester) async {
|
testWidgets('CanvasView scales as expected', (WidgetTester tester) async {
|
||||||
final controller = CanvasController(debug: true);
|
final controller = LazyCanvasController(debug: true);
|
||||||
controller.addChild(const Offset(0, 0), (_) => TestChild(index: 0));
|
controller.addChild(const Offset(0, 0), (_) => TestChild(index: 0));
|
||||||
controller.addChild(const Offset(100, 100), (_) => TestChild(index: 1));
|
controller.addChild(const Offset(100, 100), (_) => TestChild(index: 1));
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
MaterialApp(
|
MaterialApp(
|
||||||
home: Scaffold(
|
home: Scaffold(
|
||||||
body: CanvasView(controller: controller, canvasBackground: SingleColorBackround(Colors.white)),
|
body: LazyCanvas(controller: controller, canvasBackground: SingleColorBackround(Colors.white)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
final context = tester.element(find.byType(CanvasView));
|
final context = tester.element(find.byType(LazyCanvas));
|
||||||
|
|
||||||
// Initial size check
|
// Initial size check
|
||||||
final finder = find.byType(TestChild);
|
final finder = find.byType(TestChild);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:infinite_lazy_2d_grid/core/spatial_hashing.dart';
|
import 'package:infinite_lazy_grid/core/spatial_hashing.dart';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user