OLD | NEW |
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 Loading... |
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 } |
OLD | NEW |