Commit 0abd3c9e authored by Adam Barth's avatar Adam Barth

Clean up stock_app.dart

This CL cleans up stock_app.dart to better separate concerns now that we have
StyleNode. Also, this CL introduces IconButton, which will grow to include an
ink effect in the future, and makes the background of the search bar white.

R=ojan@chromium.org

Review URL: https://codereview.chromium.org/1007893005
parent e1e5d938
...@@ -7,6 +7,7 @@ import 'package:sky/framework/components/drawer.dart'; ...@@ -7,6 +7,7 @@ import 'package:sky/framework/components/drawer.dart';
import 'package:sky/framework/components/drawer_header.dart'; import 'package:sky/framework/components/drawer_header.dart';
import 'package:sky/framework/components/floating_action_button.dart'; import 'package:sky/framework/components/floating_action_button.dart';
import 'package:sky/framework/components/icon.dart'; import 'package:sky/framework/components/icon.dart';
import 'package:sky/framework/components/icon_button.dart';
import 'package:sky/framework/components/input.dart'; import 'package:sky/framework/components/input.dart';
import 'package:sky/framework/components/menu_divider.dart'; import 'package:sky/framework/components/menu_divider.dart';
import 'package:sky/framework/components/menu_item.dart'; import 'package:sky/framework/components/menu_item.dart';
...@@ -15,24 +16,23 @@ import 'package:sky/framework/components/scaffold.dart'; ...@@ -15,24 +16,23 @@ import 'package:sky/framework/components/scaffold.dart';
import 'package:sky/framework/debug/tracing.dart'; import 'package:sky/framework/debug/tracing.dart';
import 'package:sky/framework/fn.dart'; import 'package:sky/framework/fn.dart';
import 'package:sky/framework/theme/typography.dart' as typography; import 'package:sky/framework/theme/typography.dart' as typography;
import 'package:sky/framework/theme/colors.dart';
import 'stock_data.dart'; import 'stock_data.dart';
import 'stock_list.dart'; import 'stock_list.dart';
import 'stock_menu.dart'; import 'stock_menu.dart';
class StocksApp extends App { class StocksApp extends App {
DrawerController _drawerController = new DrawerController(); DrawerController _drawerController = new DrawerController();
PopupMenuController _menuController; PopupMenuController _menuController;
static Style _iconStyle = new Style(''' static final Style _actionBarStyle = new Style('''
padding: 8px;''' background-color: ${Purple[500]};''');
);
static final Style _searchBarStyle = new Style('''
background-color: ${Grey[50]};''');
static Style _titleStyle = new Style(''' static final Style _titleStyle = new Style('''
padding-left: 24px; ${typography.white.title};''');
flex: 1;
${typography.white.title};'''
);
StockDataFetcher _stockDataFetcher; StockDataFetcher _stockDataFetcher;
List<Stock> _stocks = []; List<Stock> _stocks = [];
...@@ -48,16 +48,16 @@ class StocksApp extends App { ...@@ -48,16 +48,16 @@ class StocksApp extends App {
}); });
} }
void _handleSearchClick(_) { void _handleSearchBegin(_) {
setState(() { setState(() {
_isSearching = !_isSearching; _isSearching = true;
}); });
} }
void _handleMenuClick(_) { void _handleSearchEnd(_) {
setState(() { setState(() {
_menuController = new PopupMenuController(); _isSearching = false;
_menuController.open(); _searchQuery = null;
}); });
} }
...@@ -67,74 +67,75 @@ class StocksApp extends App { ...@@ -67,74 +67,75 @@ class StocksApp extends App {
}); });
} }
Node build() { void _handleMenuClick(_) {
var drawer = new Drawer( setState(() {
_menuController = new PopupMenuController();
_menuController.open();
});
}
Drawer buildDrawer() {
return new Drawer(
controller: _drawerController, controller: _drawerController,
level: 3, level: 3,
children: [ children: [
new DrawerHeader( new DrawerHeader(children: [new Text('Stocks')]),
children: [new Text('Stocks')]
),
new MenuItem( new MenuItem(
key: 'Inbox', key: 'Inbox',
icon: 'content/inbox', icon: 'content/inbox',
children: [new Text('Inbox')] children: [new Text('Inbox')]),
), new MenuDivider(),
new MenuDivider(
),
new MenuItem( new MenuItem(
key: 'Drafts', key: 'Drafts',
icon: 'content/drafts', icon: 'content/drafts',
children: [new Text('Drafts')] children: [new Text('Drafts')]),
),
new MenuItem( new MenuItem(
key: 'Settings', key: 'Settings',
icon: 'action/settings', icon: 'action/settings',
children: [new Text('Settings')] children: [new Text('Settings')]),
),
new MenuItem( new MenuItem(
key: 'Help & Feedback', key: 'Help & Feedback',
icon: 'action/help', icon: 'action/help',
children: [new Text('Help & Feedback')] children: [new Text('Help & Feedback')])
)
] ]
); );
}
Node title; Node buildActionBar() {
if (_isSearching) { return new StyleNode(
title = new Input(focused: true, placeholder: 'Search stocks', new ActionBar(
onChanged: _handleSearchQueryChanged); left: new IconButton(
} else { icon: 'navigation/menu_white',
title = new Text('Stocks'); onGestureTap: _drawerController.toggle),
} center: new Container(
var actionBar = new ActionBar(
children: [
new EventTarget(
new Icon(key: 'menu', style: _iconStyle,
size: 24,
type: 'navigation/menu_white'),
onGestureTap: _drawerController.toggle
),
new Container(
style: _titleStyle, style: _titleStyle,
children: [title] children: [new Text('Stocks')]),
), right: [
new EventTarget( new IconButton(
new Icon(key: 'search', style: _iconStyle, icon: 'action/search_white',
size: 24, onGestureTap: _handleSearchBegin),
type: 'action/search_white'), new IconButton(
onGestureTap: _handleSearchClick icon: 'navigation/more_vert_white',
), onGestureTap: _handleMenuClick)
new EventTarget( ]),
new Icon(key: 'more_white', style: _iconStyle, _actionBarStyle);
size: 24, }
type: 'navigation/more_vert_white'),
onGestureTap: _handleMenuClick
)
]
);
// TODO(abarth): Should we factor this into a SearchBar in the framework?
Node buildSearchBar() {
return new StyleNode(
new ActionBar(
left: new IconButton(
icon: 'navigation/arrow_back_grey600',
onGestureTap: _handleSearchEnd),
center: new Input(
focused: true,
placeholder: 'Search stocks',
onChanged: _handleSearchQueryChanged)),
_searchBarStyle);
}
Node build() {
List<Node> overlays = []; List<Node> overlays = [];
if (_menuController != null) { if (_menuController != null) {
...@@ -152,11 +153,11 @@ class StocksApp extends App { ...@@ -152,11 +153,11 @@ class StocksApp extends App {
} }
return new Scaffold( return new Scaffold(
actionBar: actionBar, header: _isSearching ? buildSearchBar() : buildActionBar(),
content: new Stocklist(stocks: _stocks, query: _searchQuery), content: new Stocklist(stocks: _stocks, query: _searchQuery),
fab: new FloatingActionButton( fab: new FloatingActionButton(
content: new Icon(type: 'content/add_white', size: 24), level: 3), content: new Icon(type: 'content/add_white', size: 24), level: 3),
drawer: drawer, drawer: buildDrawer(),
overlays: overlays overlays: overlays
); );
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment