Merge pull request #1304 from abarth/simple_widgets
Port some widgets to fn3
This commit is contained in:
commit
8c6073a5f4
41
packages/flutter/lib/src/fn3/button_state.dart
Normal file
41
packages/flutter/lib/src/fn3/button_state.dart
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
// 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 'package:sky/src/fn3/basic.dart';
|
||||||
|
import 'package:sky/src/fn3/framework.dart';
|
||||||
|
|
||||||
|
abstract class ButtonState<T extends StatefulComponent> extends ComponentState<T> {
|
||||||
|
ButtonState(T config) : super(config);
|
||||||
|
|
||||||
|
bool highlight;
|
||||||
|
|
||||||
|
void _handlePointerDown(_) {
|
||||||
|
setState(() {
|
||||||
|
highlight = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handlePointerUp(_) {
|
||||||
|
setState(() {
|
||||||
|
highlight = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handlePointerCancel(_) {
|
||||||
|
setState(() {
|
||||||
|
highlight = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return new Listener(
|
||||||
|
onPointerDown: _handlePointerDown,
|
||||||
|
onPointerUp: _handlePointerUp,
|
||||||
|
onPointerCancel: _handlePointerCancel,
|
||||||
|
child: buildContent()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget buildContent();
|
||||||
|
}
|
102
packages/flutter/lib/src/fn3/icon.dart
Normal file
102
packages/flutter/lib/src/fn3/icon.dart
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
// 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/services.dart';
|
||||||
|
import 'package:sky/src/fn3/basic.dart';
|
||||||
|
import 'package:sky/src/fn3/theme.dart';
|
||||||
|
import 'package:sky/src/fn3/framework.dart';
|
||||||
|
|
||||||
|
enum IconThemeColor { white, black }
|
||||||
|
|
||||||
|
class IconThemeData {
|
||||||
|
const IconThemeData({ this.color });
|
||||||
|
final IconThemeColor color;
|
||||||
|
}
|
||||||
|
|
||||||
|
class IconTheme extends InheritedWidget {
|
||||||
|
|
||||||
|
IconTheme({
|
||||||
|
Key key,
|
||||||
|
this.data,
|
||||||
|
Widget child
|
||||||
|
}) : super(key: key, child: child) {
|
||||||
|
assert(data != null);
|
||||||
|
assert(child != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
final IconThemeData data;
|
||||||
|
|
||||||
|
static IconThemeData of(BuildContext context) {
|
||||||
|
IconTheme result = context.inheritedWidgetOfType(IconTheme);
|
||||||
|
return result?.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool updateShouldNotify(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 StatelessComponent {
|
||||||
|
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 getColorSuffix(BuildContext context) {
|
||||||
|
IconThemeColor iconThemeColor = color;
|
||||||
|
if (iconThemeColor == null) {
|
||||||
|
IconThemeData iconThemeData = IconTheme.of(context);
|
||||||
|
iconThemeColor = iconThemeData == null ? null : iconThemeData.color;
|
||||||
|
}
|
||||||
|
if (iconThemeColor == null) {
|
||||||
|
ThemeBrightness themeBrightness = Theme.of(context).brightness;
|
||||||
|
iconThemeColor = themeBrightness == ThemeBrightness.dark ? IconThemeColor.white : IconThemeColor.black;
|
||||||
|
}
|
||||||
|
switch(iconThemeColor) {
|
||||||
|
case IconThemeColor.white:
|
||||||
|
return "white";
|
||||||
|
case IconThemeColor.black:
|
||||||
|
return "black";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
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';
|
||||||
|
String colorSuffix = getColorSuffix(context);
|
||||||
|
return new AssetImage(
|
||||||
|
bundle: _iconBundle,
|
||||||
|
name: '${category}/${density}/ic_${subtype}_${colorSuffix}_${size}dp.png',
|
||||||
|
width: size.toDouble(),
|
||||||
|
height: size.toDouble(),
|
||||||
|
colorFilter: colorFilter
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
30
packages/flutter/lib/src/fn3/theme.dart
Normal file
30
packages/flutter/lib/src/fn3/theme.dart
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// 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 'package:sky/material.dart';
|
||||||
|
import 'package:sky/src/fn3/framework.dart';
|
||||||
|
|
||||||
|
export 'package:sky/material.dart' show ThemeData, ThemeBrightness;
|
||||||
|
|
||||||
|
class Theme extends InheritedWidget {
|
||||||
|
Theme({
|
||||||
|
Key key,
|
||||||
|
this.data,
|
||||||
|
Widget child
|
||||||
|
}) : super(key: key, child: child) {
|
||||||
|
assert(child != null);
|
||||||
|
assert(data != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
final ThemeData data;
|
||||||
|
|
||||||
|
static final ThemeData _kFallbackTheme = new ThemeData.fallback();
|
||||||
|
|
||||||
|
static ThemeData of(BuildContext context) {
|
||||||
|
Theme theme = context.inheritedWidgetOfType(Theme);
|
||||||
|
return theme == null ? _kFallbackTheme : theme.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool updateShouldNotify(Theme old) => data != old.data;
|
||||||
|
}
|
19
packages/flutter/lib/src/fn3/title.dart
Normal file
19
packages/flutter/lib/src/fn3/title.dart
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// 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 'package:sky/services.dart';
|
||||||
|
import 'package:sky/src/fn3/theme.dart';
|
||||||
|
import 'package:sky/src/fn3/framework.dart';
|
||||||
|
|
||||||
|
class Title extends StatelessComponent {
|
||||||
|
Title({ this.title, this.child });
|
||||||
|
|
||||||
|
final Widget child;
|
||||||
|
final String title;
|
||||||
|
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
updateTaskDescription(title, Theme.of(context).primaryColor);
|
||||||
|
return child;
|
||||||
|
}
|
||||||
|
}
|
89
packages/flutter/lib/src/fn3/tool_bar.dart
Normal file
89
packages/flutter/lib/src/fn3/tool_bar.dart
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
// 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 'package:sky/material.dart';
|
||||||
|
import 'package:sky/painting.dart';
|
||||||
|
import 'package:sky/src/fn3/basic.dart';
|
||||||
|
import 'package:sky/src/fn3/framework.dart';
|
||||||
|
import 'package:sky/src/fn3/icon.dart';
|
||||||
|
import 'package:sky/src/fn3/theme.dart';
|
||||||
|
import 'package:sky/src/rendering/flex.dart';
|
||||||
|
|
||||||
|
class ToolBar extends StatelessComponent {
|
||||||
|
|
||||||
|
ToolBar({
|
||||||
|
Key key,
|
||||||
|
this.left,
|
||||||
|
this.center,
|
||||||
|
this.right,
|
||||||
|
this.backgroundColor
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final Widget left;
|
||||||
|
final Widget center;
|
||||||
|
final List<Widget> right;
|
||||||
|
final Color backgroundColor;
|
||||||
|
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
Color toolbarColor = backgroundColor;
|
||||||
|
IconThemeData iconThemeData;
|
||||||
|
TextStyle centerStyle = Typography.white.title;
|
||||||
|
TextStyle sideStyle = Typography.white.body1;
|
||||||
|
if (toolbarColor == null) {
|
||||||
|
ThemeData themeData = Theme.of(context);
|
||||||
|
toolbarColor = themeData.primaryColor;
|
||||||
|
if (themeData.primaryColorBrightness == ThemeBrightness.light) {
|
||||||
|
centerStyle = Typography.black.title;
|
||||||
|
sideStyle = Typography.black.body2;
|
||||||
|
iconThemeData = const IconThemeData(color: IconThemeColor.black);
|
||||||
|
} else {
|
||||||
|
iconThemeData = const IconThemeData(color: IconThemeColor.white);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Widget> children = new List<Widget>();
|
||||||
|
|
||||||
|
// left children
|
||||||
|
if (left != null)
|
||||||
|
children.add(left);
|
||||||
|
|
||||||
|
// center children (left-aligned, but takes all remaining space)
|
||||||
|
children.add(
|
||||||
|
new Flexible(
|
||||||
|
child: new Padding(
|
||||||
|
child: center != null ? new DefaultTextStyle(child: center, style: centerStyle) : null,
|
||||||
|
padding: new EdgeDims.only(left: 24.0)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// right children
|
||||||
|
if (right != null)
|
||||||
|
children.addAll(right);
|
||||||
|
|
||||||
|
Widget content = new Container(
|
||||||
|
child: new DefaultTextStyle(
|
||||||
|
style: sideStyle,
|
||||||
|
child: new Column([
|
||||||
|
new Container(
|
||||||
|
child: new Row(children),
|
||||||
|
height: kToolBarHeight
|
||||||
|
),
|
||||||
|
],
|
||||||
|
justifyContent: FlexJustifyContent.end
|
||||||
|
)
|
||||||
|
),
|
||||||
|
padding: new EdgeDims.symmetric(horizontal: 8.0),
|
||||||
|
decoration: new BoxDecoration(
|
||||||
|
backgroundColor: toolbarColor,
|
||||||
|
boxShadow: shadows[2]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (iconThemeData != null)
|
||||||
|
content = new IconTheme(data: iconThemeData, child: content);
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user