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
);