// Copyright 2015 The Chromium 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 'dart:math' as math; import 'package:sky/widgets.dart'; class MixedViewportApp extends App { MixedViewportLayoutState layoutState = new MixedViewportLayoutState(); List<double> lengths = <double>[]; double offset = 0.0; static const double kMaxLength = 100.0; static math.Random rand = new math.Random(); void addBox() { lengths.add(rand.nextDouble() * kMaxLength); updateEnabledState(); } void removeBox(int index) { lengths.removeAt(index); updateEnabledState(); } void goUp() { offset -= 9.9; updateEnabledState(); } void goDown() { offset += 20.45; updateEnabledState(); } bool enabledDown = true; bool enabledUp = true; bool enabledAdd = true; bool enabledRemove = false; void updateEnabledState() { setState(() { enabledUp = offset > -100.0; enabledDown = offset < lengths.fold(0.0, (double result, double len) => result + len) + 100.0; enabledAdd = true; enabledRemove = lengths.length > 0; }); } Widget build() { return new Theme( data: new ThemeData.light(), child: new Scaffold( toolbar: new ToolBar( center: new Text('Block Viewport Demo')), body: new Material( type: MaterialType.canvas, child: new Flex([ new Container( padding: new EdgeDims.symmetric(horizontal: 8.0, vertical: 25.0), child: new Flex([ new RaisedButton( enabled: enabledAdd, child: new Text('ADD'), onPressed: addBox ), new RaisedButton( enabled: enabledUp, child: new Text('UP'), onPressed: goUp ), new RaisedButton( enabled: enabledDown, child: new Text('DOWN'), onPressed: goDown ) ], justifyContent: FlexJustifyContent.spaceAround ) ), new Flexible( child: new Container( margin: new EdgeDims.all(8.0), decoration: new BoxDecoration( border: new Border.all(color: new Color(0xFF000000)) ), padding: new EdgeDims.all(16.0), child: new MixedViewport( builder: builder, startOffset: offset, token: lengths.length, layoutState: layoutState ) ) ), ], direction: FlexDirection.vertical, justifyContent: FlexJustifyContent.spaceBetween ) ) ) ); } Widget builder(int index) { if (index >= lengths.length) return null; return new Listener( key: new Key.stringify(lengths[index]), child: new Container( decoration: new BoxDecoration( backgroundColor: new Color((0xFF000000 + 0xFFFFFF * lengths[index] / kMaxLength).round()) ), height: lengths[index] + 12.0 ), onGestureTap: (_) { removeBox(index); } ); } } void main() { runApp(new MixedViewportApp()); // scheduler.addPersistentFrameCallback((_) { // SkyBinding.instance.debugDumpRenderTree(); // }); }