Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(666)

Unified Diff: sky/sdk/lib/widgets/scrollable_viewport.dart

Issue 1223153004: Make the drawer, popup menus, dialogs, and settings page scrollable. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/sdk/lib/widgets/popup_menu.dart ('k') | sky/tests/examples/stocks-expected.txt » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/sdk/lib/widgets/scrollable_viewport.dart
diff --git a/sky/sdk/lib/widgets/scrollable_viewport.dart b/sky/sdk/lib/widgets/scrollable_viewport.dart
new file mode 100644
index 0000000000000000000000000000000000000000..a64627fe1d5ff520007854f98cf0ff954bb2ec4a
--- /dev/null
+++ b/sky/sdk/lib/widgets/scrollable_viewport.dart
@@ -0,0 +1,71 @@
+// 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 '../animation/scroll_behavior.dart';
+import 'basic.dart';
+import 'scrollable.dart';
+
+class ScrollableViewport extends Scrollable {
+
+ ScrollableViewport({ String key, this.child }) : super(key: key);
+
+ Widget child;
+
+ void syncFields(ScrollableViewport source) {
+ child = source.child;
+ super.syncFields(source);
+ }
+
+ ScrollBehavior createScrollBehavior() => new FlingBehavior();
+ FlingBehavior get scrollBehavior => super.scrollBehavior;
+
+ double _viewportHeight = 0.0;
+ double _childHeight = 0.0;
+ void _handleViewportSizeChanged(Size newSize) {
+ setState(() {
+ _viewportHeight = newSize.height;
+ _updateScrollBehaviour();
+ });
+ }
+ void _handleChildSizeChanged(Size newSize) {
+ setState(() {
+ _childHeight = newSize.height;
+ _updateScrollBehaviour();
+ });
+ }
+ void _updateScrollBehaviour() {
+ scrollBehavior.contentsSize = _childHeight;
+ scrollBehavior.containerSize = _viewportHeight;
+ if (scrollOffset > scrollBehavior.maxScrollOffset)
+ settleScrollOffset();
+ }
+
+ Widget buildContent() {
+ return new SizeObserver(
+ callback: _handleViewportSizeChanged,
+ child: new Viewport(
+ offset: scrollOffset,
+ child: new SizeObserver(
+ callback: _handleChildSizeChanged,
+ child: child
+ )
+ )
+ );
+ }
+
+}
+
+class ScrollableBlock extends Component {
+
+ ScrollableBlock(this.children, { String key }) : super(key: key);
+
+ final List<Widget> children;
+
+ Widget build() {
+ return new ScrollableViewport(
+ child: new Block(children)
+ );
+ }
+
+}
« no previous file with comments | « sky/sdk/lib/widgets/popup_menu.dart ('k') | sky/tests/examples/stocks-expected.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698