| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/material.dart'; |
| |
| import 'tile_model.dart'; |
| |
| typedef TileSizerBuilder = Widget Function( |
| BuildContext context, |
| Axis direction, |
| TileModel tileBefore, |
| TileModel tileAfter, |
| ); |
| |
| class Sizer extends StatelessWidget { |
| final Axis direction; |
| final TileSizerBuilder sizerBuilder; |
| final TileModel tileBefore; |
| final TileModel tileAfter; |
| final bool horizontal; |
| |
| Sizer({ |
| this.direction, |
| this.tileBefore, |
| this.tileAfter, |
| this.sizerBuilder, |
| }) : horizontal = direction == Axis.horizontal; |
| |
| @override |
| Widget build(BuildContext context) { |
| final sizer = sizerBuilder?.call(context, direction, tileBefore, tileAfter); |
| if (sizer == null) { |
| return SizedBox.shrink(); |
| } else { |
| return Listener( |
| onPointerMove: _onPointerMove, |
| child: Container( |
| color: Colors.transparent, |
| child: sizer, |
| ), |
| ); |
| } |
| } |
| |
| void _onPointerMove(PointerMoveEvent event) { |
| double delta = |
| direction == Axis.horizontal ? event.delta.dy : event.delta.dx; |
| tileBefore.resize(delta); |
| tileAfter.resize(-delta); |
| if (tileBefore.overflowed || tileAfter.overflowed) { |
| tileBefore.resize(-delta); |
| tileAfter.resize(delta); |
| } |
| } |
| } |