// 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:sky' as sky; import 'package:sky/mojo/asset_bundle.dart'; import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/theme.dart'; import 'package:sky/widgets/framework.dart'; enum IconThemeColor { white, black } class IconThemeData { const IconThemeData({ this.color }); final IconThemeColor color; } class IconTheme extends Inherited { IconTheme({ Key key, this.data, Widget child }) : super(key: key, child: child) { assert(data != null); assert(child != null); } final IconThemeData data; static IconThemeData of(Component component) { IconTheme result = component.inheritedOfType(IconTheme); return result == null ? null : result.data; } bool syncShouldNotify(IconTheme old) => data != old.data; } AssetBundle _initIconBundle() { if (rootBundle != null) return rootBundle; const String _kAssetBase = '/packages/material_design_icons/icons/'; return new NetworkAssetBundle(Uri.base.resolve(_kAssetBase)); } final AssetBundle _iconBundle = _initIconBundle(); class Icon extends Component { Icon({ Key key, this.size, this.type: '', this.color, this.colorFilter }) : super(key: key); final int size; final String type; final IconThemeColor color; final sky.ColorFilter colorFilter; String get colorSuffix { IconThemeColor iconThemeColor = color; if (iconThemeColor == null) { IconThemeData iconThemeData = IconTheme.of(this); iconThemeColor = iconThemeData == null ? null : iconThemeData.color; } if (iconThemeColor == null) { ThemeBrightness themeBrightness = Theme.of(this).brightness; iconThemeColor = themeBrightness == ThemeBrightness.dark ? IconThemeColor.white : IconThemeColor.black; } switch(iconThemeColor) { case IconThemeColor.white: return "white"; case IconThemeColor.black: return "black"; } } Widget build() { String category = ''; String subtype = ''; List<String> parts = type.split('/'); if (parts.length == 2) { category = parts[0]; subtype = parts[1]; } // TODO(eseidel): This clearly isn't correct. Not sure what would be. // Should we use the ios images on ios? String density = 'drawable-xxhdpi'; return new AssetImage( bundle: _iconBundle, name: '${category}/${density}/ic_${subtype}_${colorSuffix}_${size}dp.png', width: size.toDouble(), height: size.toDouble(), colorFilter: colorFilter ); } }