CWA-216 | applied new design to settings page and change language page; reworked settings widgets, standard switch and picker; deleted provider picker; changed background colors in the faq page

Oleksandr Sobol committed May 21, 2020 at 21:01 UTC 1bed82327b87fed4df2eb4f8cb10ae3c7d237bd8
13 files changed +377 -439
lib/src/screens/exchange/widgets/present_provider_picker.dart
+2 -2
@@ -2,10 +2,10 @@ import 'package:flutter/material.dart';
2 import 'package:cake_wallet/src/stores/exchange/exchange_store.dart';
3 import 'package:cake_wallet/src/domain/exchange/exchange_provider_description.dart';
4 import 'package:cake_wallet/src/domain/exchange/exchange_provider.dart';
5 -import 'package:cake_wallet/src/screens/exchange/widgets/provider_picker.dart';
5 import 'package:flutter_mobx/flutter_mobx.dart';
6 import 'package:cake_wallet/generated/i18n.dart';
7 import 'package:cake_wallet/palette.dart';
8 +import 'package:cake_wallet/src/widgets/picker.dart';
9
10 class PresentProviderPicker extends StatelessWidget {
11 PresentProviderPicker({@required this.exchangeStore});
@@ -72,7 +72,7 @@ class PresentProviderPicker extends StatelessWidget {
72 }
73
74 showDialog<void>(
75 - builder: (_) => ProviderPicker(
75 + builder: (_) => Picker(
76 items: items,
77 images: images,
78 selectedAtIndex: selectedItem,
lib/src/screens/exchange/widgets/provider_picker.dart deleted
-124
@@ -1,124 +0,0 @@
1 -import 'dart:ui';
2 -import 'package:flutter/cupertino.dart';
3 -import 'package:flutter/material.dart';
4 -import 'package:cake_wallet/palette.dart';
5 -import 'package:cake_wallet/src/domain/exchange/exchange_provider.dart';
6 -
7 -class ProviderPicker extends StatelessWidget {
8 - ProviderPicker({
9 - @required this.selectedAtIndex,
10 - @required this.items,
11 - @required this.images,
12 - @required this.title,
13 - @required this.onItemSelected,
14 - });
15 -
16 - final int selectedAtIndex;
17 - final List<ExchangeProvider> items;
18 - final List<Image> images;
19 - final String title;
20 - final Function(ExchangeProvider) onItemSelected;
21 -
22 - @override
23 - Widget build(BuildContext context) {
24 - return GestureDetector(
25 - onTap: () => Navigator.of(context).pop(),
26 - child: Container(
27 - color: Colors.transparent,
28 - child: BackdropFilter(
29 - filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0),
30 - child: Container(
31 - decoration: BoxDecoration(color: PaletteDark.historyPanel.withOpacity(0.75)),
32 - child: Center(
33 - child: Column(
34 - mainAxisSize: MainAxisSize.min,
35 - children: <Widget>[
36 - Container(
37 - padding: EdgeInsets.only(left: 24, right: 24),
38 - child: Text(
39 - title,
40 - textAlign: TextAlign.center,
41 - style: TextStyle(
42 - fontSize: 18,
43 - fontWeight: FontWeight.bold,
44 - decoration: TextDecoration.none,
45 - color: Colors.white
46 - ),
47 - ),
48 - ),
49 - Padding(
50 - padding: EdgeInsets.only(left: 24, right: 24, top: 24),
51 - child: GestureDetector(
52 - onTap: () => null,
53 - child: ClipRRect(
54 - borderRadius: BorderRadius.all(Radius.circular(14)),
55 - child: Container(
56 - height: 233,
57 - color: PaletteDark.menuList,
58 - child: ListView.separated(
59 - separatorBuilder: (context, index) => Divider(
60 - color: PaletteDark.mainBackgroundColor,
61 - height: 1,
62 - ),
63 - itemCount: items == null ? 0 : items.length,
64 - itemBuilder: (context, index) {
65 - final item = items[index];
66 - final image = images[index];
67 - final isItemSelected = index == selectedAtIndex;
68 -
69 - final color = isItemSelected
70 - ? PaletteDark.menuHeader
71 - : Colors.transparent;
72 - final textColor = isItemSelected
73 - ? Colors.blue
74 - : Colors.white;
75 -
76 - return GestureDetector(
77 - onTap: () {
78 - if (onItemSelected == null) {
79 - return;
80 - }
81 - Navigator.of(context).pop();
82 - onItemSelected(item);
83 - },
84 - child: Container(
85 - height: 77,
86 - padding: EdgeInsets.only(left: 24, right: 24),
87 - color: color,
88 - child: Row(
89 - mainAxisSize: MainAxisSize.min,
90 - mainAxisAlignment: MainAxisAlignment.start,
91 - crossAxisAlignment: CrossAxisAlignment.center,
92 - children: <Widget>[
93 - image,
94 - Padding(
95 - padding: EdgeInsets.only(left: 12),
96 - child: Text(
97 - item.toString(),
98 - style: TextStyle(
99 - fontSize: 18,
100 - fontWeight: FontWeight.bold,
101 - color: textColor,
102 - decoration: TextDecoration.none,
103 - ),
104 - ),
105 - )
106 - ],
107 - ),
108 - ),
109 - );
110 - },
111 - )
112 - ),
113 - ),
114 - ),
115 - )
116 - ],
117 - ),
118 - )
119 - ),
120 - ),
121 - ),
122 - );
123 - }
124 -}
\ No newline at end of file
lib/src/screens/faq/faq_page.dart
+42 -27
@@ -1,4 +1,5 @@
1 import 'dart:convert';
2 +import 'package:cake_wallet/palette.dart';
3 import 'package:flutter/material.dart';
4 import 'package:flutter/services.dart';
5 import 'package:provider/provider.dart';
@@ -10,41 +11,55 @@ class FaqPage extends BasePage {
11 @override
12 String get title => S.current.faq;
13
14 + @override
15 + Color get backgroundColor => PaletteDark.historyPanel;
16 +
17 @override
18 Widget body(BuildContext context) {
15 - return FutureBuilder(
16 - builder: (context, snapshot) {
17 - final faqItems = jsonDecode(snapshot.data.toString()) as List;
19 + return Container(
20 + color: PaletteDark.historyPanel,
21 + padding: EdgeInsets.only(top: 12),
22 + child: Container(
23 + color: PaletteDark.menuList,
24 + child: FutureBuilder(
25 + builder: (context, snapshot) {
26 + final faqItems = jsonDecode(snapshot.data.toString()) as List;
27
19 - return ListView.separated(
20 - itemBuilder: (BuildContext context, int index) {
21 - final itemTitle = faqItems[index]["question"].toString();
22 - final itemChild = faqItems[index]["answer"].toString();
28 + return ListView.separated(
29 + itemBuilder: (BuildContext context, int index) {
30 + final itemTitle = faqItems[index]["question"].toString();
31 + final itemChild = faqItems[index]["answer"].toString();
32
24 - return ExpansionTile(
25 - title: Text(itemTitle),
26 - children: <Widget>[
27 - Row(
28 - mainAxisAlignment: MainAxisAlignment.start,
33 + return ExpansionTile(
34 + title: Padding(
35 + padding: EdgeInsets.only(left: 8, top: 12, bottom: 12),
36 + child: Text(itemTitle),
37 + ),
38 + backgroundColor: PaletteDark.menuHeader,
39 children: <Widget>[
30 - Expanded(
31 - child: Container(
32 - padding: EdgeInsets.only(left: 15.0, right: 15.0),
33 - child: Text(
34 - itemChild,
35 - ),
36 - ))
40 + Row(
41 + mainAxisAlignment: MainAxisAlignment.start,
42 + children: <Widget>[
43 + Expanded(
44 + child: Container(
45 + padding: EdgeInsets.only(left: 24.0, right: 24.0, bottom: 4),
46 + child: Text(
47 + itemChild,
48 + ),
49 + ))
50 + ],
51 + )
52 ],
38 - )
39 - ],
53 + );
54 + },
55 + separatorBuilder: (_, __) =>
56 + Divider(color: PaletteDark.mainBackgroundColor, height: 1.0),
57 + itemCount: faqItems == null ? 0 : faqItems.length,
58 );
59 },
42 - separatorBuilder: (_, __) =>
43 - Divider(color: Theme.of(context).dividerTheme.color, height: 1.0),
44 - itemCount: faqItems == null ? 0 : faqItems.length,
45 - );
46 - },
47 - future: rootBundle.loadString(getFaqPath(context)),
60 + future: rootBundle.loadString(getFaqPath(context)),
61 + ),
62 + ),
63 );
64 }
65
lib/src/screens/settings/change_language.dart
+73 -48
@@ -5,76 +5,101 @@ import 'package:cake_wallet/generated/i18n.dart';
5 import 'package:cake_wallet/src/domain/common/language.dart';
6 import 'package:cake_wallet/src/stores/settings/settings_store.dart';
7 import 'package:cake_wallet/src/screens/base_page.dart';
8 +import 'package:cake_wallet/palette.dart';
9 +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
10
11 class ChangeLanguage extends BasePage {
12 @override
13 String get title => S.current.settings_change_language;
14
15 + @override
16 + Color get backgroundColor => PaletteDark.historyPanel;
17 +
18 @override
19 Widget body(BuildContext context) {
20 final settingsStore = Provider.of<SettingsStore>(context);
21 final currentLanguage = Provider.of<Language>(context);
22
18 - final currentColor = Theme.of(context).selectedRowColor;
19 - final notCurrentColor = Theme.of(context).accentTextTheme.subhead.backgroundColor;
23 + final currentColor = Colors.green;
24 + final notCurrentColor = Colors.white;
25 +
26 + final shortDivider = Container(
27 + height: 1,
28 + padding: EdgeInsets.only(left: 24),
29 + color: PaletteDark.menuList,
30 + child: Container(
31 + height: 1,
32 + color: PaletteDark.mainBackgroundColor,
33 + ),
34 + );
35 +
36 + final longDivider = Container(
37 + height: 1,
38 + color: PaletteDark.mainBackgroundColor,
39 + );
40
41 return Container(
22 - padding: EdgeInsets.only(top: 10.0, bottom: 10.0),
42 + color: PaletteDark.historyPanel,
43 + padding: EdgeInsets.only(top: 10.0),
44 child: ListView.builder(
45 itemCount: languages.values.length,
46 itemBuilder: (BuildContext context, int index) {
47 + final item = languages.values.elementAt(index);
48 + final code = languages.keys.elementAt(index);
49 +
50 final isCurrent = settingsStore.languageCode == null
51 ? false
28 - : languages.keys.elementAt(index) ==
29 - settingsStore.languageCode;
52 + : code == settingsStore.languageCode;
53
31 - return Container(
32 - margin: EdgeInsets.only(top: 10.0, bottom: 10.0),
33 - color: isCurrent ? currentColor : notCurrentColor,
34 - child: ListTile(
35 - title: Text(
36 - languages.values.elementAt(index),
37 - style: TextStyle(
38 - fontSize: 16.0,
39 - color: Theme.of(context).primaryTextTheme.title.color),
40 - ),
41 - onTap: () async {
42 - if (!isCurrent) {
43 - await showDialog<void>(
44 - context: context,
45 - builder: (BuildContext context) {
46 - return AlertDialog(
47 - title: Text(
48 - S.of(context).change_language,
49 - textAlign: TextAlign.center,
50 - ),
51 - content: Text(
52 - S.of(context).change_language_to(
53 - languages.values.elementAt(index)),
54 - textAlign: TextAlign.center,
55 - ),
56 - actions: <Widget>[
57 - FlatButton(
58 - onPressed: () => Navigator.of(context).pop(),
59 - child: Text(S.of(context).cancel)),
60 - FlatButton(
61 - onPressed: () {
54 + return Column(
55 + children: <Widget>[
56 + index == 0 ? longDivider : Offstage(),
57 + Container(
58 + padding: EdgeInsets.only(top: 4, bottom: 4),
59 + color: PaletteDark.menuList,
60 + child: ListTile(
61 + contentPadding: EdgeInsets.only(left: 24, right: 24),
62 + title: Text(
63 + item,
64 + style: TextStyle(
65 + fontSize: 14.0,
66 + fontWeight: FontWeight.w600,
67 + color: isCurrent ? currentColor : notCurrentColor
68 + ),
69 + ),
70 + trailing: isCurrent
71 + ? Icon(Icons.done, color: currentColor)
72 + : Offstage(),
73 + onTap: () async {
74 + if (!isCurrent) {
75 + await showDialog<void>(
76 + context: context,
77 + builder: (BuildContext context) {
78 + return AlertWithTwoActions(
79 + alertTitle: S.of(context).change_language,
80 + alertContent: S.of(context).change_language_to(item),
81 + leftButtonText: S.of(context).change,
82 + rightButtonText: S.of(context).cancel,
83 + actionLeftButton: () {
84 settingsStore.saveLanguageCode(
63 - languageCode:
64 - languages.keys.elementAt(index));
65 - currentLanguage.setCurrentLanguage(
66 - languages.keys.elementAt(index));
85 + languageCode: code);
86 + currentLanguage.setCurrentLanguage(code);
87 Navigator.of(context).pop();
88 },
69 - child: Text(S.of(context).change)),
70 - ],
71 - );
72 - });
73 - }
74 - },
75 - ),
89 + actionRightButton: () => Navigator.of(context).pop()
90 + );
91 + });
92 + }
93 + },
94 + ),
95 + ),
96 + item == languages.values.last
97 + ? longDivider
98 + : shortDivider
99 + ],
100 );
101 },
78 - ));
102 + )
103 + );
104 }
105 }
lib/src/screens/settings/settings.dart
+119 -117
@@ -17,7 +17,7 @@ import 'package:cake_wallet/src/screens/settings/attributes.dart';
17 import 'package:cake_wallet/src/screens/disclaimer/disclaimer_page.dart';
18 import 'package:cake_wallet/src/screens/settings/items/settings_item.dart';
19 import 'package:cake_wallet/src/screens/settings/items/item_headers.dart';
20 -import 'package:cake_wallet/src/widgets/present_picker.dart';
20 +import 'package:cake_wallet/src/widgets/picker.dart';
21 // Settings widgets
22 import 'package:cake_wallet/src/screens/settings/widgets/settings_arrow_list_row.dart';
23 import 'package:cake_wallet/src/screens/settings/widgets/settings_header_list_row.dart';
@@ -31,10 +31,7 @@ class SettingsPage extends BasePage {
31 String get title => S.current.settings_title;
32
33 @override
34 - bool get isModalBackButton => true;
35 -
36 - @override
37 - Color get backgroundColor => Palette.lightGrey2;
34 + Color get backgroundColor => PaletteDark.historyPanel;
35
36 @override
37 Widget body(BuildContext context) {
@@ -73,21 +70,6 @@ class SettingsFormState extends State<SettingsForm> {
70 settingsStore.setItemHeaders();
71
72 _items.addAll([
76 - SettingsItem(title: ItemHeaders.nodes, attribute: Attributes.header),
77 - SettingsItem(
78 - onTaped: () => Navigator.of(context).pushNamed(Routes.nodeList),
79 - title: ItemHeaders.currentNode,
80 - widget: Observer(
81 - builder: (_) => Text(
82 - settingsStore.node == null ? '' : settingsStore.node.uri,
83 - textAlign: TextAlign.right,
84 - style: TextStyle(
85 - fontSize: 16.0,
86 - color:
87 - Theme.of(context).primaryTextTheme.subtitle.color),
88 - )),
89 - attribute: Attributes.widget),
90 - SettingsItem(title: ItemHeaders.wallets, attribute: Attributes.header),
73 SettingsItem(
74 onTaped: () => _setBalance(context),
75 title: ItemHeaders.displayBalanceAs,
@@ -96,9 +78,8 @@ class SettingsFormState extends State<SettingsForm> {
78 settingsStore.balanceDisplayMode.toString(),
79 textAlign: TextAlign.right,
80 style: TextStyle(
99 - fontSize: 16.0,
100 - color:
101 - Theme.of(context).primaryTextTheme.subtitle.color),
81 + fontSize: 14.0,
82 + color: PaletteDark.walletCardText),
83 )),
84 attribute: Attributes.widget),
85 SettingsItem(
@@ -109,9 +90,8 @@ class SettingsFormState extends State<SettingsForm> {
90 settingsStore.fiatCurrency.toString(),
91 textAlign: TextAlign.right,
92 style: TextStyle(
112 - fontSize: 16.0,
113 - color:
114 - Theme.of(context).primaryTextTheme.subtitle.color),
93 + fontSize: 14.0,
94 + color: PaletteDark.walletCardText),
95 )),
96 attribute: Attributes.widget),
97 SettingsItem(
@@ -122,15 +102,14 @@ class SettingsFormState extends State<SettingsForm> {
102 settingsStore.transactionPriority.toString(),
103 textAlign: TextAlign.right,
104 style: TextStyle(
125 - fontSize: 16.0,
126 - color:
127 - Theme.of(context).primaryTextTheme.subtitle.color),
105 + fontSize: 14.0,
106 + color: PaletteDark.walletCardText),
107 )),
108 attribute: Attributes.widget),
109 SettingsItem(
110 title: ItemHeaders.saveRecipientAddress,
111 attribute: Attributes.switcher),
133 - SettingsItem(title: ItemHeaders.personal, attribute: Attributes.header),
112 + SettingsItem(title: '', attribute: Attributes.header),
113 SettingsItem(
114 onTaped: () {
115 Navigator.of(context).pushNamed(Routes.auth,
@@ -196,17 +175,14 @@ class SettingsFormState extends State<SettingsForm> {
175 ],
176 child: Container(
177 height: 56,
199 - padding: EdgeInsets.only(left: 20, right: 20),
178 + padding: EdgeInsets.only(left: 24, right: 24),
179 child: Row(
180 mainAxisAlignment: MainAxisAlignment.spaceBetween,
181 children: [
182 Text(S.of(context).settings_display_on_dashboard_list,
183 style: TextStyle(
205 - fontSize: 16,
206 - color: Theme.of(context)
207 - .primaryTextTheme
208 - .title
209 - .color)),
184 + fontSize: 14,
185 + color: Colors.white)),
186 Observer(builder: (_) {
187 var title = '';
188
@@ -233,17 +209,14 @@ class SettingsFormState extends State<SettingsForm> {
209
210 return Text(title,
211 style: TextStyle(
236 - fontSize: 16.0,
237 - color: Theme.of(context)
238 - .primaryTextTheme
239 - .subtitle
240 - .color));
212 + fontSize: 14.0,
213 + color: PaletteDark.walletCardText));
214 })
215 ]),
216 ));
217 },
218 attribute: Attributes.rawWidget),
246 - SettingsItem(title: ItemHeaders.support, attribute: Attributes.header),
219 + SettingsItem(title: '', attribute: Attributes.header),
220 SettingsItem(
221 onTaped: () => _launchUrl(_emailUrl),
222 title: 'Email',
@@ -253,13 +226,13 @@ class SettingsFormState extends State<SettingsForm> {
226 SettingsItem(
227 onTaped: () => _launchUrl(_telegramUrl),
228 title: 'Telegram',
256 - link: 't.me/cakewallet_bot',
229 + link: 'Cake_Wallet',
230 image: _telegramImage,
231 attribute: Attributes.link),
232 SettingsItem(
233 onTaped: () => _launchUrl(_twitterUrl),
234 title: 'Twitter',
262 - link: 'twitter.com/CakewalletXMR',
235 + link: '@CakeWalletXMR',
236 image: _twitterImage,
237 attribute: Attributes.link),
238 SettingsItem(
@@ -268,18 +241,18 @@ class SettingsFormState extends State<SettingsForm> {
241 link: 'support@changenow.io',
242 image: _changeNowImage,
243 attribute: Attributes.link),
244 + SettingsItem(
245 + onTaped: () => _launchUrl(_morphUrl),
246 + title: 'Morph',
247 + link: 'support@morphtoken.com',
248 + image: _morphImage,
249 + attribute: Attributes.link),
250 SettingsItem(
251 onTaped: () => _launchUrl(_xmrToUrl),
252 title: 'XMR.to',
253 link: 'support@xmr.to',
254 image: _xmrBtcImage,
255 attribute: Attributes.link),
277 - SettingsItem(
278 - onTaped: () => _launchUrl(_morphUrl),
279 - title: 'MorphToken',
280 - link: 'support@morphtoken.com',
281 - image: _morphImage,
282 - attribute: Attributes.link),
256 SettingsItem(
257 onTaped: () {
258 Navigator.push(
@@ -345,87 +318,116 @@ class SettingsFormState extends State<SettingsForm> {
318 final settingsStore = Provider.of<SettingsStore>(context);
319 settingsStore.setItemHeaders();
320
348 - return SingleChildScrollView(
349 - child: Column(
350 - children: <Widget>[
351 - ListView.builder(
352 - shrinkWrap: true,
353 - physics: NeverScrollableScrollPhysics(),
354 - itemCount: _items.length,
355 - itemBuilder: (context, index) {
356 - final item = _items[index];
357 - bool _isDrawDivider = true;
358 -
359 - if (item.attribute == Attributes.header || item == _items.last) {
360 - _isDrawDivider = false;
361 - } else {
362 - if (_items[index + 1].attribute == Attributes.header) {
363 - _isDrawDivider = false;
364 - }
365 - }
366 -
367 - return Column(
368 - children: <Widget>[
369 - _getWidget(item),
370 - _isDrawDivider
371 - ? Container(
372 - color: Theme.of(context)
373 - .accentTextTheme
374 - .headline
375 - .backgroundColor,
376 - padding: EdgeInsets.only(
377 - left: 20.0,
378 - right: 20.0,
379 - ),
380 - child: Divider(
381 - color: Theme.of(context).dividerColor,
382 - height: 1.0,
383 - ),
384 - )
385 - : Offstage()
386 - ],
387 - );
388 - }),
389 - ListTile(
390 - contentPadding: EdgeInsets.only(left: 20.0),
391 - title: Text(
392 - settingsStore.itemHeaders[ItemHeaders.version],
393 - style: TextStyle(
394 - fontSize: 14.0, color: Palette.wildDarkBlue)
395 - ),
396 - )
397 - ],
398 - ));
321 + final shortDivider = Container(
322 + height: 1,
323 + padding: EdgeInsets.only(left: 24),
324 + color: PaletteDark.menuList,
325 + child: Container(
326 + height: 1,
327 + color: PaletteDark.mainBackgroundColor,
328 + ),
329 + );
330 +
331 + final longDivider = Container(
332 + height: 1,
333 + color: PaletteDark.mainBackgroundColor,
334 + );
335 +
336 + return Container(
337 + color: PaletteDark.historyPanel,
338 + padding: EdgeInsets.only(top: 12),
339 + child: SingleChildScrollView(
340 + child: Column(
341 + children: <Widget>[
342 + longDivider,
343 + ListView.builder(
344 + shrinkWrap: true,
345 + physics: NeverScrollableScrollPhysics(),
346 + itemCount: _items.length,
347 + itemBuilder: (context, index) {
348 + final item = _items[index];
349 +
350 + Widget divider;
351 +
352 + if (item.attribute == Attributes.header || item == _items.last) {
353 + divider = longDivider;
354 + } else if (_items[index + 1].attribute == Attributes.header){
355 + divider = longDivider;
356 + } else {
357 + divider = shortDivider;
358 + }
359 +
360 + return Column(
361 + children: <Widget>[
362 + _getWidget(item),
363 + divider
364 + ],
365 + );
366 + }),
367 + Padding(
368 + padding: EdgeInsets.only(top: 12),
369 + child: ListTile(
370 + title: Center(
371 + child: Text(
372 + settingsStore.itemHeaders[ItemHeaders.version],
373 + style: TextStyle(
374 + fontSize: 14.0, color: PaletteDark.walletCardText)
375 + ),
376 + ),
377 + ),
378 + )
379 + ],
380 + )),
381 + );
382 }
383
384 Future<void> _setBalance(BuildContext context) async {
385 final settingsStore = Provider.of<SettingsStore>(context);
403 - final selectedDisplayMode =
404 - await presentPicker(context, BalanceDisplayMode.all);
386 + final items = BalanceDisplayMode.all;
387 + final selectedItem = items.indexOf(settingsStore.balanceDisplayMode);
388
406 - if (selectedDisplayMode != null) {
407 - await settingsStore.setCurrentBalanceDisplayMode(
408 - balanceDisplayMode: selectedDisplayMode);
409 - }
389 + await showDialog<void>(
390 + builder: (_) => Picker(
391 + items: items,
392 + selectedAtIndex: selectedItem,
393 + title: S.of(context).please_select,
394 + mainAxisAlignment: MainAxisAlignment.center,
395 + onItemSelected: (BalanceDisplayMode mode) async =>
396 + await settingsStore.setCurrentBalanceDisplayMode(
397 + balanceDisplayMode: mode)),
398 + context: context);
399 }
400
401 Future<void> _setCurrency(BuildContext context) async {
402 final settingsStore = Provider.of<SettingsStore>(context);
414 - final selectedCurrency = await presentPicker(context, FiatCurrency.all);
403 + final items = FiatCurrency.all;
404 + final selectedItem = items.indexOf(settingsStore.fiatCurrency);
405
416 - if (selectedCurrency != null) {
417 - await settingsStore.setCurrentFiatCurrency(currency: selectedCurrency);
418 - }
406 + await showDialog<void>(
407 + builder: (_) => Picker(
408 + items: items,
409 + selectedAtIndex: selectedItem,
410 + title: S.of(context).please_select,
411 + mainAxisAlignment: MainAxisAlignment.center,
412 + onItemSelected: (FiatCurrency currency) async =>
413 + await settingsStore.setCurrentFiatCurrency(currency: currency)),
414 + context: context);
415 }
416
417 Future<void> _setTransactionPriority(BuildContext context) async {
418 final settingsStore = Provider.of<SettingsStore>(context);
423 - final selectedPriority =
424 - await presentPicker(context, TransactionPriority.all);
419 + final items = TransactionPriority.all;
420 + final selectedItem = items.indexOf(settingsStore.transactionPriority);
421
426 - if (selectedPriority != null) {
427 - await settingsStore.setCurrentTransactionPriority(
428 - priority: selectedPriority);
429 - }
422 + await showDialog<void>(
423 + builder: (_) => Picker(
424 + items: items,
425 + selectedAtIndex: selectedItem,
426 + title: S.of(context).please_select,
427 + mainAxisAlignment: MainAxisAlignment.center,
428 + onItemSelected: (TransactionPriority priority) async =>
429 + await settingsStore.setCurrentTransactionPriority(
430 + priority: priority)),
431 + context: context);
432 }
433 }
lib/src/screens/settings/widgets/settings_arrow_list_row.dart
+7 -5
@@ -1,3 +1,4 @@
1 +import 'package:cake_wallet/palette.dart';
2 import 'package:provider/provider.dart';
3 import 'package:flutter/material.dart';
4 import 'package:flutter_mobx/flutter_mobx.dart';
@@ -8,22 +9,23 @@ class SettingsArrowListRow extends StatelessWidget {
9
10 final VoidCallback onTaped;
11 final String title;
11 - final _cakeArrowImage = Image.asset('assets/images/cake_arrow.png');
12 + final _cakeArrowImage = Image.asset('assets/images/select_arrow.png',
13 + color: PaletteDark.walletCardText);
14
15 @override
16 Widget build(BuildContext context) {
17 final settingsStore = Provider.of<SettingsStore>(context);
18
19 return Container(
18 - color: Theme.of(context).accentTextTheme.headline.backgroundColor,
20 + color: PaletteDark.menuList,
21 child: ListTile(
20 - contentPadding: EdgeInsets.only(left: 20.0, right: 20.0),
22 + contentPadding: EdgeInsets.only(left: 24.0, right: 24.0),
23 title: Observer(
24 builder: (_) => Text(
25 settingsStore.itemHeaders[title],
26 style: TextStyle(
25 - fontSize: 16.0,
26 - color: Theme.of(context).primaryTextTheme.title.color),
27 + fontSize: 14.0,
28 + color: Colors.white),
29 )),
30 trailing: _cakeArrowImage,
31 onTap: onTaped),
lib/src/screens/settings/widgets/settings_header_list_row.dart
+4 -2
@@ -16,7 +16,7 @@ class SettingsHeaderListRow extends StatelessWidget {
16 return Column(
17 children: <Widget>[
18 SizedBox(
19 - height: 28.0,
19 + height: 20.0,
20 ),
21 Container(
22 padding: EdgeInsets.only(left: 20.0),
@@ -25,7 +25,9 @@ class SettingsHeaderListRow extends StatelessWidget {
25 children: <Widget>[
26 Observer(
27 builder: (_) => Text(
28 - settingsStore.itemHeaders[title],
28 + title.isNotEmpty
29 + ? settingsStore.itemHeaders[title]
30 + : '',
31 style: TextStyle(
32 fontSize: 15.0, color: Palette.wildDarkBlue),
33 ))
lib/src/screens/settings/widgets/settings_link_list_row.dart
+5 -6
@@ -13,9 +13,9 @@ class SettingsLinktListRow extends StatelessWidget {
13 @override
14 Widget build(BuildContext context) {
15 return Container(
16 - color: Theme.of(context).accentTextTheme.headline.backgroundColor,
16 + color: PaletteDark.menuList,
17 child: ListTile(
18 - contentPadding: EdgeInsets.only(left: 20.0, right: 20.0),
18 + contentPadding: EdgeInsets.only(left: 24.0, right: 24.0),
19 title: Row(
20 mainAxisAlignment: MainAxisAlignment.start,
21 mainAxisSize: MainAxisSize.min,
@@ -26,16 +26,15 @@ class SettingsLinktListRow extends StatelessWidget {
26 child: Text(
27 title,
28 style: TextStyle(
29 - fontSize: 15.0,
30 - fontWeight: FontWeight.w500,
31 - color: Theme.of(context).primaryTextTheme.title.color),
29 + fontSize: 14.0,
30 + color: Colors.white),
31 ),
32 )
33 ],
34 ),
35 trailing: Text(
36 link,
38 - style: TextStyle(fontSize: 14.0, color: Palette.cakeGreen),
37 + style: TextStyle(fontSize: 14.0, color: Colors.blue),
38 ),
39 onTap: onTaped,
40 ),
lib/src/screens/settings/widgets/settings_raw_widget_list_row.dart
+2 -1
@@ -1,4 +1,5 @@
1 import 'package:flutter/material.dart';
2 +import 'package:cake_wallet/palette.dart';
3
4 class SettingRawWidgetListRow extends StatelessWidget {
5 SettingRawWidgetListRow({@required this.widgetBuilder});
@@ -8,7 +9,7 @@ class SettingRawWidgetListRow extends StatelessWidget {
9 @override
10 Widget build(BuildContext context) {
11 return Container(
11 - color: Theme.of(context).accentTextTheme.headline.backgroundColor,
12 + color: PaletteDark.menuList,
13 child: widgetBuilder(context) ?? Container(),
14 );
15 }
lib/src/screens/settings/widgets/settings_switch_list_row.dart
+5 -4
@@ -1,3 +1,4 @@
1 +import 'package:cake_wallet/palette.dart';
2 import 'package:flutter/material.dart';
3 import 'package:provider/provider.dart';
4 import 'package:flutter_mobx/flutter_mobx.dart';
@@ -61,14 +62,14 @@ class SettingsSwitchListRow extends StatelessWidget {
62 final settingsStore = Provider.of<SettingsStore>(context);
63
64 return Container(
64 - color: Theme.of(context).accentTextTheme.headline.backgroundColor,
65 + color: PaletteDark.menuList,
66 child: ListTile(
66 - contentPadding: EdgeInsets.only(left: 20.0, right: 20.0),
67 + contentPadding: EdgeInsets.only(left: 24.0, right: 24.0),
68 title: Observer(
69 builder: (_) => Text(settingsStore.itemHeaders[title],
70 style: TextStyle(
70 - fontSize: 16.0,
71 - color: Theme.of(context).primaryTextTheme.title.color)),
71 + fontSize: 14,
72 + color: Colors.white)),
73 ),
74 trailing: _getSwitch(context)),
75 );
lib/src/screens/settings/widgets/settings_text_list_row.dart
+5 -4
@@ -1,3 +1,4 @@
1 +import 'package:cake_wallet/palette.dart';
2 import 'package:provider/provider.dart';
3 import 'package:flutter/material.dart';
4 import 'package:flutter_mobx/flutter_mobx.dart';
@@ -15,9 +16,9 @@ class SettingsTextListRow extends StatelessWidget {
16 final settingsStore = Provider.of<SettingsStore>(context);
17
18 return Container(
18 - color: Theme.of(context).accentTextTheme.headline.backgroundColor,
19 + color: PaletteDark.menuList,
20 child: ListTile(
20 - contentPadding: EdgeInsets.only(left: 20.0, right: 20.0),
21 + contentPadding: EdgeInsets.only(left: 24.0, right: 24.0),
22 title: Row(
23 mainAxisAlignment: MainAxisAlignment.spaceBetween,
24 children: <Widget>[
@@ -26,8 +27,8 @@ class SettingsTextListRow extends StatelessWidget {
27 builder: (_) => Text(
28 settingsStore.itemHeaders[title],
29 style: TextStyle(
29 - fontSize: 16.0,
30 - color: Theme.of(context).primaryTextTheme.title.color),
30 + fontSize: 14.0,
31 + color: Colors.white),
32 )),
33 ),
34 Flexible(
lib/src/widgets/picker.dart
+100 -81
@@ -1,19 +1,23 @@
1 import 'dart:ui';
2 import 'package:flutter/material.dart';
3 +import 'package:cake_wallet/palette.dart';
4
5 class Picker<Item extends Object> extends StatelessWidget {
5 - Picker(
6 - {@required this.selectedAtIndex,
7 - @required this.items,
8 - @required this.title,
9 - this.pickerHeight = 300,
10 - this.onItemSelected});
6 + Picker({
7 + @required this.selectedAtIndex,
8 + @required this.items,
9 + this.images,
10 + @required this.title,
11 + @required this.onItemSelected,
12 + this.mainAxisAlignment = MainAxisAlignment.start
13 + });
14
15 final int selectedAtIndex;
16 final List<Item> items;
17 + final List<Image> images;
18 final String title;
15 - final double pickerHeight;
19 final Function(Item) onItemSelected;
20 + final MainAxisAlignment mainAxisAlignment;
21
22 @override
23 Widget build(BuildContext context) {
@@ -24,83 +28,98 @@ class Picker<Item extends Object> extends StatelessWidget {
28 child: BackdropFilter(
29 filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0),
30 child: Container(
27 - decoration: BoxDecoration(color: Colors.white.withOpacity(0.55)),
28 - child: Column(
29 - mainAxisAlignment: MainAxisAlignment.end,
30 - children: [
31 - GestureDetector(
32 - onTap: () => null,
33 - child: Container(
34 - width: double.infinity,
35 - height: pickerHeight,
36 - color: Theme.of(context).backgroundColor,
37 - child: ListView.separated(
38 - itemCount: items.length + 1,
39 - separatorBuilder: (_, index) => index == 0
40 - ? SizedBox()
41 - : Divider(
42 - height: 1,
43 - color: Color.fromRGBO(235, 238, 242, 1)),
44 - itemBuilder: (_, index) {
45 - if (index == 0) {
46 - return Container(
47 - height: 100,
48 - width: double.infinity,
49 - color: Theme.of(context).backgroundColor,
50 - child: Center(
51 - child: Text(
52 - title,
53 - textAlign: TextAlign.center,
54 - style: TextStyle(
55 - fontSize: 26,
56 - fontWeight: FontWeight.w600,
57 - fontFamily: 'Lato',
58 - decoration: TextDecoration.none,
59 - color: Theme.of(context)
60 - .primaryTextTheme
61 - .caption
62 - .color),
31 + decoration: BoxDecoration(color: PaletteDark.historyPanel.withOpacity(0.75)),
32 + child: Center(
33 + child: Column(
34 + mainAxisSize: MainAxisSize.min,
35 + children: <Widget>[
36 + Container(
37 + padding: EdgeInsets.only(left: 24, right: 24),
38 + child: Text(
39 + title,
40 + textAlign: TextAlign.center,
41 + style: TextStyle(
42 + fontSize: 18,
43 + fontWeight: FontWeight.bold,
44 + decoration: TextDecoration.none,
45 + color: Colors.white
46 + ),
47 + ),
48 + ),
49 + Padding(
50 + padding: EdgeInsets.only(left: 24, right: 24, top: 24),
51 + child: GestureDetector(
52 + onTap: () => null,
53 + child: ClipRRect(
54 + borderRadius: BorderRadius.all(Radius.circular(14)),
55 + child: Container(
56 + height: 233,
57 + color: PaletteDark.menuList,
58 + child: ListView.separated(
59 + separatorBuilder: (context, index) => Divider(
60 + color: PaletteDark.mainBackgroundColor,
61 + height: 1,
62 ),
64 - ),
65 - );
66 - }
63 + itemCount: items == null ? 0 : items.length,
64 + itemBuilder: (context, index) {
65 + final item = items[index];
66 + final image = images != null? images[index] : null;
67 + final isItemSelected = index == selectedAtIndex;
68
68 - index -= 1;
69 - final item = items[index];
69 + final color = isItemSelected
70 + ? PaletteDark.menuHeader
71 + : Colors.transparent;
72 + final textColor = isItemSelected
73 + ? Colors.blue
74 + : Colors.white;
75
71 - return GestureDetector(
72 - onTap: () {
73 - if (onItemSelected == null) {
74 - return;
75 - }
76 - Navigator.of(context).pop();
77 - onItemSelected(item);
78 - },
79 - child: Container(
80 - color: Colors.transparent,
81 - padding: EdgeInsets.only(top: 18, bottom: 18),
82 - child: Center(
83 - child: Text(
84 - item.toString(),
85 - style: TextStyle(
86 - decoration: TextDecoration.none,
87 - fontSize: 18,
88 - fontWeight: FontWeight.normal,
89 - fontFamily: 'Lato',
90 - color: index == selectedAtIndex
91 - ? Color.fromRGBO(138, 80, 255, 1)
92 - : Theme.of(context)
93 - .primaryTextTheme
94 - .caption
95 - .color),
96 - )),
97 - ),
98 - );
99 - },
100 - )),
101 - )
102 - ],
103 - ),
76 + return GestureDetector(
77 + onTap: () {
78 + if (onItemSelected == null) {
79 + return;
80 + }
81 + Navigator.of(context).pop();
82 + onItemSelected(item);
83 + },
84 + child: Container(
85 + height: 77,
86 + padding: EdgeInsets.only(left: 24, right: 24),
87 + color: color,
88 + child: Row(
89 + mainAxisSize: MainAxisSize.max,
90 + mainAxisAlignment: mainAxisAlignment,
91 + crossAxisAlignment: CrossAxisAlignment.center,
92 + children: <Widget>[
93 + image != null
94 + ? image
95 + : Offstage(),
96 + Padding(
97 + padding: EdgeInsets.only(
98 + left: image != null ? 12 : 0
99 + ),
100 + child: Text(
101 + item.toString(),
102 + style: TextStyle(
103 + fontSize: 18,
104 + fontWeight: FontWeight.bold,
105 + color: textColor,
106 + decoration: TextDecoration.none,
107 + ),
108 + ),
109 + )
110 + ],
111 + ),
112 + ),
113 + );
114 + },
115 + )
116 + ),
117 + ),
118 + ),
119 + )
120 + ],
121 + ),
122 + )
123 ),
124 ),
125 ),
lib/src/widgets/standart_switch.dart
+13 -18
@@ -1,3 +1,5 @@
1 +import 'package:cake_wallet/palette.dart';
2 +import 'package:flutter/cupertino.dart';
3 import 'package:flutter/material.dart';
4
5 class StandartSwitch extends StatefulWidget {
@@ -16,29 +18,22 @@ class StandartSwitchState extends State<StandartSwitch> {
18 return GestureDetector(
19 onTap: widget.onTaped,
20 child: AnimatedContainer(
19 - padding: EdgeInsets.only(left: 4.0, right: 4.0),
21 + padding: EdgeInsets.only(left: 2.0, right: 2.0),
22 alignment: widget.value ? Alignment.centerRight : Alignment.centerLeft,
23 duration: Duration(milliseconds: 250),
22 - width: 55.0,
23 - height: 33.0,
24 + width: 50,
25 + height: 28,
26 decoration: BoxDecoration(
25 - color: Theme.of(context).toggleButtonsTheme.color,
26 - border: Border.all(
27 - color: Theme.of(context).toggleButtonsTheme.borderColor),
28 - borderRadius: BorderRadius.all(Radius.circular(10.0))),
27 + color: widget.value
28 + ? Colors.green
29 + : PaletteDark.mainBackgroundColor,
30 + borderRadius: BorderRadius.all(Radius.circular(14.0))),
31 child: Container(
30 - width: 25.0,
31 - height: 25.0,
32 + width: 24.0,
33 + height: 24.0,
34 decoration: BoxDecoration(
33 - color: widget.value
34 - ? Theme.of(context).toggleButtonsTheme.selectedColor
35 - : Theme.of(context).toggleButtonsTheme.disabledColor,
36 - borderRadius: BorderRadius.all(Radius.circular(8.0))),
37 - child: Icon(
38 - widget.value ? Icons.check : Icons.close,
39 - color: Colors.white,
40 - size: 16.0,
41 - ),
35 + color: Colors.white,
36 + shape: BoxShape.circle),
37 ),
38 ),
39 );