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

Side by Side Diff: sky/sdk/lib/widgets/tabs.dart

Issue 1212993003: Add TabNavigator (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Updated tabs example test expectations 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 unified diff | Download patch
« no previous file with comments | « sky/sdk/example/widgets/tabs.dart ('k') | sky/tests/examples/tabs-expected.txt » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 import 'dart:math' as math; 5 import 'dart:math' as math;
6 6
7 import 'package:sky/rendering/box.dart'; 7 import 'package:sky/rendering/box.dart';
8 import 'package:sky/rendering/object.dart'; 8 import 'package:sky/rendering/object.dart';
9 import 'package:sky/widgets/basic.dart'; 9 import 'package:sky/widgets/basic.dart';
10 import 'package:sky/widgets/icon.dart'; 10 import 'package:sky/widgets/icon.dart';
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 } 254 }
255 255
256 class TabBar extends Component { 256 class TabBar extends Component {
257 TabBar({ 257 TabBar({
258 String key, 258 String key,
259 this.labels, 259 this.labels,
260 this.selectedIndex: 0, 260 this.selectedIndex: 0,
261 this.onChanged 261 this.onChanged
262 }) : super(key: key); 262 }) : super(key: key);
263 263
264 final List<TabLabel> labels; 264 final Iterable<TabLabel> labels;
265 final int selectedIndex; 265 final int selectedIndex;
266 final SelectedIndexChanged onChanged; 266 final SelectedIndexChanged onChanged;
267 267
268 void _handleTap(int tabIndex) { 268 void _handleTap(int tabIndex) {
269 if (tabIndex != selectedIndex && onChanged != null) 269 if (tabIndex != selectedIndex && onChanged != null)
270 onChanged(tabIndex); 270 onChanged(tabIndex);
271 } 271 }
272 272
273 Widget _toTab(TabLabel label, int tabIndex) { 273 Widget _toTab(TabLabel label, int tabIndex) {
274 Tab tab = new Tab( 274 Tab tab = new Tab(
275 label: label, 275 label: label,
276 selected: tabIndex == selectedIndex, 276 selected: tabIndex == selectedIndex,
277 key: label.text == null ? label.icon : label.text 277 key: label.text == null ? label.icon : label.text
278 ); 278 );
279 return new Listener( 279 return new Listener(
280 child: tab, 280 child: tab,
281 onGestureTap: (_) => _handleTap(tabIndex) 281 onGestureTap: (_) => _handleTap(tabIndex)
282 ); 282 );
283 } 283 }
284 284
285 Widget build() { 285 Widget build() {
286 assert(labels != null && labels.isNotEmpty); 286 assert(labels != null && labels.isNotEmpty);
287 List<Widget> tabs = <Widget>[]; 287 List<Widget> tabs = <Widget>[];
288 bool textAndIcons = false; 288 bool textAndIcons = false;
289 for (int tabIndex = 0; tabIndex < labels.length; tabIndex++) { 289 int tabIndex = 0;
290 tabs.add(_toTab(labels[tabIndex], tabIndex)); 290 for (TabLabel label in labels) {
291 if (labels[tabIndex].text != null && labels[tabIndex].icon != null) 291 tabs.add(_toTab(label, tabIndex++));
292 if (label.text != null && label.icon != null)
292 textAndIcons = true; 293 textAndIcons = true;
293 } 294 }
294 return new TabBarWrapper( 295 return new TabBarWrapper(
295 children: tabs, 296 children: tabs,
296 selectedIndex: selectedIndex, 297 selectedIndex: selectedIndex,
297 backgroundColor: Theme.of(this).primary[500], 298 backgroundColor: Theme.of(this).primary[500],
298 indicatorColor: Theme.of(this).accent[200], 299 indicatorColor: Theme.of(this).accent[200],
299 textAndIcons: textAndIcons 300 textAndIcons: textAndIcons
300 ); 301 );
301 } 302 }
302 } 303 }
304
305 class TabNavigatorView {
306 TabNavigatorView({ this.label, this.builder });
307
308 final TabLabel label;
309 final Builder builder;
310
311 Widget buildContent() {
312 assert(builder != null);
313 Widget content = builder();
314 assert(content != null);
315 return content;
316 }
317 }
318
319 class TabNavigator extends Component {
320 TabNavigator({
321 String key,
322 this.views,
323 this.selectedIndex: 0,
324 this.onChanged
325 }) : super(key: key);
326
327 final List<TabNavigatorView> views;
328 final int selectedIndex;
329 final SelectedIndexChanged onChanged;
330
331 void _handleSelectedIndexChanged(int tabIndex) {
332 if (onChanged != null)
333 onChanged(tabIndex);
334 }
335
336 Widget build() {
337 assert(views != null && views.isNotEmpty);
338 assert(selectedIndex >= 0 && selectedIndex < views.length);
339
340 TabBar tabBar = new TabBar(
341 labels: views.map((view) => view.label),
342 onChanged: _handleSelectedIndexChanged,
343 selectedIndex: selectedIndex
344 );
345
346 Widget content = views[selectedIndex].buildContent();
347 return new Flex([tabBar, new Flexible(child: content)],
348 direction: FlexDirection.vertical
349 );
350 }
351 }
OLDNEW
« no previous file with comments | « sky/sdk/example/widgets/tabs.dart ('k') | sky/tests/examples/tabs-expected.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698