From d61103ac4270c97fef51881a3d428e4c3c4f3911 Mon Sep 17 00:00:00 2001 From: estevez-dev Date: Sat, 14 Sep 2019 12:14:54 +0300 Subject: [PATCH] WIP #224 Dynamic multi column view --- lib/main.dart | 1 + lib/plugins/DynamicMultiColumnLayout.dart | 146 ++++++++++++++++++++++ lib/view.dart | 20 +-- pubspec.lock | 4 +- 4 files changed, 162 insertions(+), 9 deletions(-) create mode 100644 lib/plugins/DynamicMultiColumnLayout.dart diff --git a/lib/main.dart b/lib/main.dart index 03c4af3..f062ef6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -25,6 +25,7 @@ import 'package:in_app_purchase/in_app_purchase.dart'; import 'plugins/circular_slider/single_circular_slider.dart'; import 'package:share/receive_share_state.dart'; import 'package:share/share.dart'; +import 'plugins/DynamicMultiColumnLayout.dart'; import 'utils/logger.dart'; diff --git a/lib/plugins/DynamicMultiColumnLayout.dart b/lib/plugins/DynamicMultiColumnLayout.dart new file mode 100644 index 0000000..116462f --- /dev/null +++ b/lib/plugins/DynamicMultiColumnLayout.dart @@ -0,0 +1,146 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'dart:math' as math; + +class DynamicMultiColumnLayout extends MultiChildRenderObjectWidget { + + final int minColumnWidth; + + DynamicMultiColumnLayout({ + Key key, + this.minColumnWidth: 350, + List children = const [], + }) : super(key: key, children: children); + + @override + RenderCustomLayoutBox createRenderObject(BuildContext context) { + return RenderCustomLayoutBox(minColumnWidth: this.minColumnWidth); + } + +} + +class RenderCustomLayoutBox extends RenderBox + with ContainerRenderObjectMixin, + RenderBoxContainerDefaultsMixin { + + final int minColumnWidth; + + RenderCustomLayoutBox({ + this.minColumnWidth, + List children, + }) { + addAll(children); + } + + @override + void setupParentData(RenderBox child) { + if (child.parentData is! CustomLayoutParentData) { + child.parentData = CustomLayoutParentData(); + } + } + + double _getIntrinsicHeight(double childSize(RenderBox child)) { + double inflexibleSpace = 0.0; + RenderBox child = firstChild; + while (child != null) { + inflexibleSpace += childSize(child); + final FlexParentData childParentData = child.parentData; + child = childParentData.nextSibling; + } + return inflexibleSpace; + } + + double _getIntrinsicWidth(double childSize(RenderBox child)) { + double maxSpace = 0.0; + RenderBox child = firstChild; + while (child != null) { + maxSpace = math.max(maxSpace, childSize(child)); + final FlexParentData childParentData = child.parentData; + child = childParentData.nextSibling; + } + return maxSpace; + } + + @override + double computeMinIntrinsicWidth(double height) { + return _getIntrinsicWidth((RenderBox child) => child.getMinIntrinsicWidth(height)); + } + + @override + double computeMaxIntrinsicWidth(double height) { + return _getIntrinsicWidth((RenderBox child) => child.getMaxIntrinsicWidth(height)); + } + + @override + double computeMinIntrinsicHeight(double width) { + return _getIntrinsicHeight((RenderBox child) => child.getMinIntrinsicHeight(width)); + } + + @override + double computeMaxIntrinsicHeight(double width) { + return _getIntrinsicHeight((RenderBox child) => child.getMaxIntrinsicHeight(width)); + } + + @override + void performLayout() { + int columnsCount; + List columnXPositions = []; + List columnYPositions = []; + if (childCount == 0) { + size = constraints.biggest; + assert(size.isFinite); + return; + } + + columnsCount = (constraints.maxWidth ~/ this.minColumnWidth); + double columnWidth = constraints.maxWidth / columnsCount; + double startY = 0; + for (int i =0; i < columnsCount; i++) { + columnXPositions.add(i*columnWidth); + columnYPositions.add(startY); + } + RenderBox child = firstChild; + while (child != null) { + final CustomLayoutParentData childParentData = child.parentData; + + int columnToAdd = 0; + double minYPosition = columnYPositions[0]; + for (int i=0; i height) { + height = columnYPositions[i]; + } + } + + size = Size(width, height); + } + + @override + void paint(PaintingContext context, Offset offset) { + defaultPaint(context, offset); + } + + @override + bool hitTestChildren(HitTestResult result, { Offset position }) { + return defaultHitTestChildren(result, position: position); + } +} + +class CustomLayoutParentData extends ContainerBoxParentData { + +} \ No newline at end of file diff --git a/lib/view.dart b/lib/view.dart index 7a3ee9a..b3eef0b 100644 --- a/lib/view.dart +++ b/lib/view.dart @@ -31,6 +31,16 @@ class ViewWidgetState extends State { child: _buildPanelChild(context), ); } else { + return ListView( + shrinkWrap: true, + padding: EdgeInsets.all(0), + children: [ + DynamicMultiColumnLayout( + minColumnWidth: Sizes.minViewColumnWidth, + children: _buildChildren(context), + ) + ] + ); return ListView( shrinkWrap: true, padding: EdgeInsets.all(0), @@ -61,7 +71,7 @@ class ViewWidgetState extends State { List result = []; int layoutChildId = 0; - if (widget.view.badges.isNotEmpty) { + /*if (widget.view.badges.isNotEmpty) { result.add( LayoutId( id: "badges", @@ -73,15 +83,11 @@ class ViewWidgetState extends State { ), ) ); - } + }*/ widget.view.cards.forEach((HACard card){ result.add( - LayoutId( - id: 'card_$layoutChildId', - child: card.build(context), - ) + card.build(context) ); - layoutChildId += 1; }); return result; diff --git a/pubspec.lock b/pubspec.lock index ce6d395..9d96ec2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -164,7 +164,7 @@ packages: name: flutter_webview_plugin url: "https://pub.dartlang.org" source: hosted - version: "0.3.7" + version: "0.3.8" http: dependency: transitive description: @@ -374,7 +374,7 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "5.1.2" + version: "5.1.3" uuid: dependency: transitive description: