Merge pull request #51 from cake-tech/CWA-201-update-wallet-menu-screen
Cwa 201 update wallet menu screen
BIN
assets/images/2.0x/crypto_lock.png
Normal file
After Width: | Height: | Size: 183 KiB |
BIN
assets/images/2.0x/eye_action.png
Normal file
After Width: | Height: | Size: 831 B |
BIN
assets/images/2.0x/load.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
assets/images/2.0x/new_wallet.png
Normal file
After Width: | Height: | Size: 270 B |
BIN
assets/images/2.0x/restore_wallet.png
Normal file
After Width: | Height: | Size: 451 B |
BIN
assets/images/2.0x/scanner.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
assets/images/2.0x/trash.png
Normal file
After Width: | Height: | Size: 913 B |
BIN
assets/images/3.0x/crypto_lock.png
Normal file
After Width: | Height: | Size: 376 KiB |
BIN
assets/images/3.0x/eye_action.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
assets/images/3.0x/load.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
assets/images/3.0x/new_wallet.png
Normal file
After Width: | Height: | Size: 474 B |
BIN
assets/images/3.0x/restore_wallet.png
Normal file
After Width: | Height: | Size: 586 B |
BIN
assets/images/3.0x/scanner.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
assets/images/3.0x/trash.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
assets/images/crypto_lock.png
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
assets/images/eye_action.png
Normal file
After Width: | Height: | Size: 481 B |
BIN
assets/images/load.png
Normal file
After Width: | Height: | Size: 831 B |
BIN
assets/images/new_wallet.png
Normal file
After Width: | Height: | Size: 182 B |
BIN
assets/images/restore_wallet.png
Normal file
After Width: | Height: | Size: 271 B |
BIN
assets/images/scanner.png
Normal file
After Width: | Height: | Size: 771 B |
BIN
assets/images/trash.png
Normal file
After Width: | Height: | Size: 506 B |
|
@ -89,5 +89,4 @@ class PaletteDark {
|
||||||
static const Color historyPanelButton = Color.fromRGBO(39, 53, 96, 1.0);
|
static const Color historyPanelButton = Color.fromRGBO(39, 53, 96, 1.0);
|
||||||
static const Color menuHeader = Color.fromRGBO(41, 52, 84, 1.0);
|
static const Color menuHeader = Color.fromRGBO(41, 52, 84, 1.0);
|
||||||
static const Color menuList = Color.fromRGBO(48, 59, 95, 1.0);
|
static const Color menuList = Color.fromRGBO(48, 59, 95, 1.0);
|
||||||
static const Color menuDivider = Color.fromRGBO(48, 59, 95, 1.0);
|
|
||||||
}
|
}
|
|
@ -195,8 +195,8 @@ class ContactFormState extends State<ContactForm> {
|
||||||
text: S.of(context).reset,
|
text: S.of(context).reset,
|
||||||
color:
|
color:
|
||||||
Theme.of(context).accentTextTheme.button.backgroundColor,
|
Theme.of(context).accentTextTheme.button.backgroundColor,
|
||||||
borderColor:
|
textColor:
|
||||||
Theme.of(context).accentTextTheme.button.decorationColor),
|
Theme.of(context).primaryTextTheme.button.color),
|
||||||
),
|
),
|
||||||
SizedBox(width: 20),
|
SizedBox(width: 20),
|
||||||
Expanded(
|
Expanded(
|
||||||
|
@ -248,10 +248,10 @@ class ContactFormState extends State<ContactForm> {
|
||||||
.primaryTextTheme
|
.primaryTextTheme
|
||||||
.button
|
.button
|
||||||
.backgroundColor,
|
.backgroundColor,
|
||||||
borderColor: Theme.of(context)
|
textColor: Theme.of(context)
|
||||||
.primaryTextTheme
|
.primaryTextTheme
|
||||||
.button
|
.button
|
||||||
.decorationColor))
|
.color))
|
||||||
],
|
],
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,13 +31,16 @@ abstract class BasePage extends StatelessWidget {
|
||||||
final _themeChanger = Provider.of<ThemeChanger>(context);
|
final _themeChanger = Provider.of<ThemeChanger>(context);
|
||||||
Image _closeButton, _backButton;
|
Image _closeButton, _backButton;
|
||||||
|
|
||||||
if (_themeChanger.getTheme() == Themes.darkTheme) {
|
_backButton = _backArrowImageDarkTheme;
|
||||||
|
_closeButton = _closeButtonImageDarkTheme;
|
||||||
|
|
||||||
|
/*if (_themeChanger.getTheme() == Themes.darkTheme) {
|
||||||
_backButton = _backArrowImageDarkTheme;
|
_backButton = _backArrowImageDarkTheme;
|
||||||
_closeButton = _closeButtonImageDarkTheme;
|
_closeButton = _closeButtonImageDarkTheme;
|
||||||
} else {
|
} else {
|
||||||
_backButton = _backArrowImage;
|
_backButton = _backArrowImage;
|
||||||
_closeButton = _closeButtonImage;
|
_closeButton = _closeButtonImage;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
return SizedBox(
|
return SizedBox(
|
||||||
height: 37,
|
height: 37,
|
||||||
|
@ -60,9 +63,10 @@ abstract class BasePage extends StatelessWidget {
|
||||||
: Text(
|
: Text(
|
||||||
title,
|
title,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 16.0,
|
fontSize: 22.0,
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.bold,
|
||||||
color: Theme.of(context).primaryTextTheme.title.color),
|
color: Colors.white),
|
||||||
|
//color: Theme.of(context).primaryTextTheme.title.color),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import 'package:provider/provider.dart';
|
||||||
import 'package:cake_wallet/generated/i18n.dart';
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
import 'package:cake_wallet/src/stores/wallet/wallet_store.dart';
|
import 'package:cake_wallet/src/stores/wallet/wallet_store.dart';
|
||||||
import 'package:cake_wallet/src/screens/auth/auth_page.dart';
|
import 'package:cake_wallet/src/screens/auth/auth_page.dart';
|
||||||
|
import 'package:cake_wallet/src/screens/dashboard/widgets/reconnect_alert_dialog.dart';
|
||||||
|
|
||||||
class WalletMenu {
|
class WalletMenu {
|
||||||
WalletMenu(this.context);
|
WalletMenu(this.context);
|
||||||
|
@ -74,7 +75,19 @@ class WalletMenu {
|
||||||
await showDialog<void>(
|
await showDialog<void>(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
return AlertDialog(
|
return ReconnectAlertDialog(
|
||||||
|
reconnectTitleText: S.of(context).reconnection,
|
||||||
|
reconnectContentText: S.of(context).reconnect_alert_text,
|
||||||
|
reconnectLeftActionButtonText: S.of(context).ok,
|
||||||
|
reconnectRightActionButtonText: S.of(context).cancel,
|
||||||
|
reconnectActionLeft: () {
|
||||||
|
walletStore.reconnect();
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
reconnectActionRight: () => Navigator.of(context).pop()
|
||||||
|
);
|
||||||
|
|
||||||
|
/*AlertDialog(
|
||||||
title: Text(
|
title: Text(
|
||||||
S.of(context).reconnection,
|
S.of(context).reconnection,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
|
@ -91,7 +104,7 @@ class WalletMenu {
|
||||||
},
|
},
|
||||||
child: Text(S.of(context).ok))
|
child: Text(S.of(context).ok))
|
||||||
],
|
],
|
||||||
);
|
);*/
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
import 'dart:ui';
|
||||||
|
import 'package:cake_wallet/src/widgets/base_alert_dialog.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
|
||||||
|
class ReconnectAlertDialog extends BaseAlertDialog {
|
||||||
|
ReconnectAlertDialog({
|
||||||
|
@required this.reconnectTitleText,
|
||||||
|
@required this.reconnectContentText,
|
||||||
|
@required this.reconnectLeftActionButtonText,
|
||||||
|
@required this.reconnectRightActionButtonText,
|
||||||
|
@required this.reconnectActionLeft,
|
||||||
|
@required this.reconnectActionRight
|
||||||
|
});
|
||||||
|
|
||||||
|
final String reconnectTitleText;
|
||||||
|
final String reconnectContentText;
|
||||||
|
final String reconnectLeftActionButtonText;
|
||||||
|
final String reconnectRightActionButtonText;
|
||||||
|
final VoidCallback reconnectActionLeft;
|
||||||
|
final VoidCallback reconnectActionRight;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get titleText => reconnectTitleText;
|
||||||
|
@override
|
||||||
|
String get contentText => reconnectContentText;
|
||||||
|
@override
|
||||||
|
String get leftActionButtonText => reconnectLeftActionButtonText;
|
||||||
|
@override
|
||||||
|
String get rightActionButtonText => reconnectRightActionButtonText;
|
||||||
|
@override
|
||||||
|
VoidCallback get actionLeft => reconnectActionLeft;
|
||||||
|
@override
|
||||||
|
VoidCallback get actionRight => reconnectActionRight;
|
||||||
|
}
|
|
@ -98,7 +98,7 @@ class TradeHistoryPanelState extends State<TradeHistoryPanel> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item is TransactionListItem) {
|
if (item is TransactionListItem) {
|
||||||
freeSpaceHeight -= 58;
|
freeSpaceHeight -= 62;
|
||||||
final transaction = item.transaction;
|
final transaction = item.transaction;
|
||||||
final savedDisplayMode = settingsStore.balanceDisplayMode;
|
final savedDisplayMode = settingsStore.balanceDisplayMode;
|
||||||
final formattedAmount =
|
final formattedAmount =
|
||||||
|
@ -123,7 +123,7 @@ class TradeHistoryPanelState extends State<TradeHistoryPanel> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item is TradeListItem) {
|
if (item is TradeListItem) {
|
||||||
freeSpaceHeight -= 58;
|
freeSpaceHeight -= 62;
|
||||||
final trade = item.trade;
|
final trade = item.trade;
|
||||||
final savedDisplayMode = settingsStore.balanceDisplayMode;
|
final savedDisplayMode = settingsStore.balanceDisplayMode;
|
||||||
final formattedAmount = trade.amount != null
|
final formattedAmount = trade.amount != null
|
||||||
|
|
|
@ -26,7 +26,7 @@ class TradeRow extends StatelessWidget {
|
||||||
return InkWell(
|
return InkWell(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 56,
|
height: 60,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: PaletteDark.historyPanel,
|
color: PaletteDark.historyPanel,
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
|
|
|
@ -24,7 +24,7 @@ class TransactionRow extends StatelessWidget {
|
||||||
return InkWell(
|
return InkWell(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 56,
|
height: 60,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: PaletteDark.historyPanel,
|
color: PaletteDark.historyPanel,
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
|
|
|
@ -361,7 +361,7 @@ class WalletCardState extends State<WalletCard> {
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 84,
|
height: 90,
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
@ -406,8 +406,8 @@ class WalletCardState extends State<WalletCard> {
|
||||||
),
|
),
|
||||||
SizedBox(width: 10),
|
SizedBox(width: 10),
|
||||||
Container(
|
Container(
|
||||||
width: 84,
|
width: 90,
|
||||||
height: 84,
|
height: 90,
|
||||||
child: QrImage(
|
child: QrImage(
|
||||||
data: walletStore.subaddress.address,
|
data: walletStore.subaddress.address,
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
|
|
|
@ -311,10 +311,10 @@ class DisclaimerBodyState extends State<DisclaimerPageBody> {
|
||||||
.primaryTextTheme
|
.primaryTextTheme
|
||||||
.button
|
.button
|
||||||
.backgroundColor,
|
.backgroundColor,
|
||||||
borderColor: Theme.of(context)
|
textColor: Theme.of(context)
|
||||||
.primaryTextTheme
|
.primaryTextTheme
|
||||||
.button
|
.button
|
||||||
.decorationColor,
|
.color,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
: Offstage(),
|
: Offstage(),
|
||||||
|
|
|
@ -69,10 +69,10 @@ class ExchangeConfirmPage extends BasePage {
|
||||||
.accentTextTheme
|
.accentTextTheme
|
||||||
.caption
|
.caption
|
||||||
.backgroundColor,
|
.backgroundColor,
|
||||||
borderColor: Theme.of(context)
|
textColor: Theme.of(context)
|
||||||
.accentTextTheme
|
.primaryTextTheme
|
||||||
.caption
|
.button
|
||||||
.decorationColor)
|
.color)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
))),
|
))),
|
||||||
|
@ -83,8 +83,8 @@ class ExchangeConfirmPage extends BasePage {
|
||||||
.pushReplacementNamed(Routes.exchangeTrade, arguments: trade),
|
.pushReplacementNamed(Routes.exchangeTrade, arguments: trade),
|
||||||
text: S.of(context).saved_the_trade_id,
|
text: S.of(context).saved_the_trade_id,
|
||||||
color: Theme.of(context).primaryTextTheme.button.backgroundColor,
|
color: Theme.of(context).primaryTextTheme.button.backgroundColor,
|
||||||
borderColor:
|
textColor:
|
||||||
Theme.of(context).primaryTextTheme.button.decorationColor),
|
Theme.of(context).primaryTextTheme.button.color),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
|
@ -173,10 +173,10 @@ class NewNodeFormState extends State<NewNodePageForm> {
|
||||||
.accentTextTheme
|
.accentTextTheme
|
||||||
.button
|
.button
|
||||||
.backgroundColor,
|
.backgroundColor,
|
||||||
borderColor: Theme.of(context)
|
textColor: Theme.of(context)
|
||||||
.accentTextTheme
|
.primaryTextTheme
|
||||||
.button
|
.button
|
||||||
.decorationColor),
|
.color),
|
||||||
)),
|
)),
|
||||||
Flexible(
|
Flexible(
|
||||||
child: Container(
|
child: Container(
|
||||||
|
@ -200,10 +200,10 @@ class NewNodeFormState extends State<NewNodePageForm> {
|
||||||
.primaryTextTheme
|
.primaryTextTheme
|
||||||
.button
|
.button
|
||||||
.backgroundColor,
|
.backgroundColor,
|
||||||
borderColor: Theme.of(context)
|
textColor: Theme.of(context)
|
||||||
.primaryTextTheme
|
.primaryTextTheme
|
||||||
.button
|
.button
|
||||||
.decorationColor,
|
.color,
|
||||||
),
|
),
|
||||||
)),
|
)),
|
||||||
],
|
],
|
||||||
|
|
|
@ -9,14 +9,15 @@ import 'package:cake_wallet/generated/i18n.dart';
|
||||||
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
||||||
import 'package:cake_wallet/src/stores/wallet_seed/wallet_seed_store.dart';
|
import 'package:cake_wallet/src/stores/wallet_seed/wallet_seed_store.dart';
|
||||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||||
|
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
|
||||||
|
|
||||||
class SeedPage extends BasePage {
|
class SeedPage extends BasePage {
|
||||||
SeedPage({this.onCloseCallback});
|
SeedPage({this.onCloseCallback});
|
||||||
|
|
||||||
static final image = Image.asset('assets/images/seed_image.png');
|
static final image = Image.asset('assets/images/crypto_lock.png');
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get isModalBackButton => true;
|
Color get backgroundColor => PaletteDark.historyPanel;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get title => S.current.seed_title;
|
String get title => S.current.seed_title;
|
||||||
|
@ -32,72 +33,91 @@ class SeedPage extends BasePage {
|
||||||
return onCloseCallback != null ? Offstage() : super.leading(context);
|
return onCloseCallback != null ? Offstage() : super.leading(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget trailing(BuildContext context) {
|
||||||
|
return onCloseCallback != null
|
||||||
|
? GestureDetector(
|
||||||
|
onTap: () => onClose(context),
|
||||||
|
child: Container(
|
||||||
|
width: 70,
|
||||||
|
height: 32,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(16)),
|
||||||
|
color: PaletteDark.menuList
|
||||||
|
),
|
||||||
|
child: Text(
|
||||||
|
S.of(context).seed_language_next,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.blue
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: Offstage();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget body(BuildContext context) {
|
Widget body(BuildContext context) {
|
||||||
final walletSeedStore = Provider.of<WalletSeedStore>(context);
|
final walletSeedStore = Provider.of<WalletSeedStore>(context);
|
||||||
String _seed;
|
String _seed;
|
||||||
|
|
||||||
return Container(
|
return Container(
|
||||||
padding: EdgeInsets.all(30.0),
|
width: double.infinity,
|
||||||
child: Column(
|
height: double.infinity,
|
||||||
|
color: PaletteDark.historyPanel,
|
||||||
|
child: ScrollableWithBottomSection(
|
||||||
|
contentPadding: EdgeInsets.only(left: 40, right: 40, bottom: 20),
|
||||||
|
content: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Expanded(
|
Padding(
|
||||||
child: Center(
|
padding: EdgeInsets.only(top: 33),
|
||||||
child: Column(
|
child: image,
|
||||||
mainAxisSize: MainAxisSize.min,
|
),
|
||||||
children: <Widget>[
|
Padding(
|
||||||
image,
|
padding: EdgeInsets.only(top: 33),
|
||||||
Container(
|
child: Observer(
|
||||||
margin: EdgeInsets.only(left: 30.0, top: 10.0, right: 30.0),
|
builder: (_) {
|
||||||
child: Observer(builder: (_) {
|
|
||||||
_seed = walletSeedStore.seed;
|
_seed = walletSeedStore.seed;
|
||||||
|
|
||||||
return Column(
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Row(
|
|
||||||
children: <Widget>[
|
|
||||||
Expanded(
|
|
||||||
child: Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border(
|
|
||||||
bottom: BorderSide(
|
|
||||||
width: 1.0,
|
|
||||||
color: Theme.of(context)
|
|
||||||
.dividerColor))),
|
|
||||||
padding: EdgeInsets.only(bottom: 20.0),
|
|
||||||
margin: EdgeInsets.only(bottom: 10.0),
|
|
||||||
child: Text(
|
|
||||||
walletSeedStore.name,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 18.0,
|
|
||||||
color: Theme.of(context)
|
|
||||||
.primaryTextTheme
|
|
||||||
.button
|
|
||||||
.color),
|
|
||||||
),
|
|
||||||
))
|
|
||||||
],
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: 10.0,
|
|
||||||
),
|
|
||||||
Text(
|
Text(
|
||||||
walletSeedStore.seed,
|
walletSeedStore.name,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: Colors.white
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(top: 20),
|
||||||
|
child: Text(
|
||||||
|
_seed,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 14.0,
|
fontSize: 14,
|
||||||
color: Theme.of(context)
|
color: PaletteDark.walletCardText
|
||||||
.primaryTextTheme
|
),
|
||||||
.title
|
),
|
||||||
.color),
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}),
|
}
|
||||||
),
|
),
|
||||||
Container(
|
)
|
||||||
margin: EdgeInsets.only(top: 30.0),
|
],
|
||||||
|
),
|
||||||
|
bottomSectionPadding: EdgeInsets.only(
|
||||||
|
left: 24,
|
||||||
|
right: 24,
|
||||||
|
bottom: 52
|
||||||
|
),
|
||||||
|
bottomSection: Container(
|
||||||
child: Row(
|
child: Row(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Flexible(
|
Flexible(
|
||||||
child: Container(
|
child: Container(
|
||||||
|
@ -107,16 +127,11 @@ class SeedPage extends BasePage {
|
||||||
S.of(context).seed_share,
|
S.of(context).seed_share,
|
||||||
_seed,
|
_seed,
|
||||||
'text/plain'),
|
'text/plain'),
|
||||||
color: Theme.of(context)
|
text: S.of(context).save,
|
||||||
.primaryTextTheme
|
color: Colors.green,
|
||||||
.button
|
textColor: Colors.white),
|
||||||
.backgroundColor,
|
)
|
||||||
borderColor: Theme.of(context)
|
),
|
||||||
.primaryTextTheme
|
|
||||||
.button
|
|
||||||
.decorationColor,
|
|
||||||
text: S.of(context).save),
|
|
||||||
)),
|
|
||||||
Flexible(
|
Flexible(
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: EdgeInsets.only(left: 8.0),
|
padding: EdgeInsets.only(left: 8.0),
|
||||||
|
@ -131,37 +146,20 @@ class SeedPage extends BasePage {
|
||||||
.of(context)
|
.of(context)
|
||||||
.copied_to_clipboard),
|
.copied_to_clipboard),
|
||||||
backgroundColor: Colors.green,
|
backgroundColor: Colors.green,
|
||||||
duration:
|
duration: Duration(milliseconds: 1500),
|
||||||
Duration(milliseconds: 1500),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
text: S.of(context).copy,
|
text: S.of(context).copy,
|
||||||
color: Theme.of(context)
|
color: Colors.blue,
|
||||||
.accentTextTheme
|
textColor: Colors.white)
|
||||||
.caption
|
|
||||||
.backgroundColor,
|
|
||||||
borderColor: Theme.of(context)
|
|
||||||
.accentTextTheme
|
|
||||||
.caption
|
|
||||||
.decorationColor),
|
|
||||||
)))
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
onCloseCallback != null
|
|
||||||
? PrimaryButton(
|
|
||||||
onPressed: () => onClose(context),
|
|
||||||
text: S.of(context).restore_next,
|
|
||||||
color: Palette.darkGrey,
|
|
||||||
borderColor: Palette.darkGrey)
|
|
||||||
: Offstage()
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,8 +43,8 @@ class SeedLanguage extends BasePage {
|
||||||
text: S.of(context).seed_language_next,
|
text: S.of(context).seed_language_next,
|
||||||
color:
|
color:
|
||||||
Theme.of(context).primaryTextTheme.button.backgroundColor,
|
Theme.of(context).primaryTextTheme.button.backgroundColor,
|
||||||
borderColor:
|
textColor:
|
||||||
Theme.of(context).primaryTextTheme.button.decorationColor),
|
Theme.of(context).primaryTextTheme.button.color),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -6,22 +6,17 @@ import 'package:cake_wallet/routes.dart';
|
||||||
import 'package:cake_wallet/palette.dart';
|
import 'package:cake_wallet/palette.dart';
|
||||||
import 'package:cake_wallet/generated/i18n.dart';
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
||||||
import 'package:cake_wallet/src/domain/common/wallet_description.dart';
|
|
||||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||||
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
|
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
|
||||||
import 'package:cake_wallet/src/stores/wallet_list/wallet_list_store.dart';
|
import 'package:cake_wallet/src/stores/wallet_list/wallet_list_store.dart';
|
||||||
|
import 'package:cake_wallet/src/stores/wallet/wallet_store.dart';
|
||||||
import 'package:cake_wallet/src/screens/wallet_list/wallet_menu.dart';
|
import 'package:cake_wallet/src/screens/wallet_list/wallet_menu.dart';
|
||||||
import 'package:cake_wallet/src/widgets/picker.dart';
|
import 'package:cake_wallet/src/screens/wallet_list/widgets/wallet_tile.dart';
|
||||||
|
|
||||||
class WalletListPage extends BasePage {
|
class WalletListPage extends BasePage {
|
||||||
@override
|
|
||||||
bool get isModalBackButton => true;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get title => S.current.wallet_list_title;
|
Color get backgroundColor => PaletteDark.historyPanel;
|
||||||
|
|
||||||
@override
|
|
||||||
AppBarStyle get appBarStyle => AppBarStyle.withShadow;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget body(BuildContext context) => WalletListBody();
|
Widget body(BuildContext context) => WalletListBody();
|
||||||
|
@ -33,92 +28,145 @@ class WalletListBody extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class WalletListBodyState extends State<WalletListBody> {
|
class WalletListBodyState extends State<WalletListBody> {
|
||||||
|
final moneroIcon = Image.asset('assets/images/monero.png', height: 24, width: 24);
|
||||||
|
final newWalletImage = Image.asset('assets/images/new_wallet.png', height: 12, width: 12, color: PaletteDark.historyPanel);
|
||||||
|
final restoreWalletImage = Image.asset('assets/images/restore_wallet.png', height: 12, width: 12, color: Colors.white);
|
||||||
WalletListStore _walletListStore;
|
WalletListStore _walletListStore;
|
||||||
|
ScrollController scrollController = ScrollController();
|
||||||
void presetMenuForWallet(WalletDescription wallet, bool isCurrentWallet,
|
|
||||||
BuildContext bodyContext) {
|
|
||||||
final walletMenu = WalletMenu(bodyContext);
|
|
||||||
final items = walletMenu.generateItemsForWalletMenu(isCurrentWallet);
|
|
||||||
|
|
||||||
showDialog<void>(
|
|
||||||
context: bodyContext,
|
|
||||||
builder: (_) => Picker(
|
|
||||||
items: items,
|
|
||||||
selectedAtIndex: -1,
|
|
||||||
title: S.of(context).wallet_menu,
|
|
||||||
onItemSelected: (String item) => walletMenu.action(
|
|
||||||
walletMenu.listItems.indexOf(item), wallet, isCurrentWallet)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
final walletStore = Provider.of<WalletStore>(context);
|
||||||
_walletListStore = Provider.of<WalletListStore>(context);
|
_walletListStore = Provider.of<WalletListStore>(context);
|
||||||
|
|
||||||
return ScrollableWithBottomSection(
|
return SafeArea(
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.only(top: 16),
|
||||||
|
color: PaletteDark.historyPanel,
|
||||||
|
child: ScrollableWithBottomSection(
|
||||||
|
contentPadding: EdgeInsets.only(bottom: 20),
|
||||||
content: Container(
|
content: Container(
|
||||||
padding: EdgeInsets.all(20),
|
|
||||||
child: Observer(
|
child: Observer(
|
||||||
builder: (_) => ListView.separated(
|
builder: (_) => ListView.separated(
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
physics: const NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
separatorBuilder: (_, index) => Divider(
|
separatorBuilder: (_, index) => Divider(
|
||||||
color: Theme.of(context).dividerTheme.color, height: 1.0),
|
color: PaletteDark.historyPanel, height: 16),
|
||||||
itemCount: _walletListStore.wallets.length,
|
itemCount: _walletListStore.wallets.length,
|
||||||
itemBuilder: (__, index) {
|
itemBuilder: (__, index) {
|
||||||
final wallet = _walletListStore.wallets[index];
|
final wallet = _walletListStore.wallets[index];
|
||||||
|
final screenWidth = MediaQuery.of(context).size.width;
|
||||||
|
|
||||||
final isCurrentWallet =
|
final isCurrentWallet =
|
||||||
_walletListStore.isCurrentWallet(wallet);
|
_walletListStore.isCurrentWallet(wallet);
|
||||||
|
|
||||||
return InkWell(
|
String shortAddress = '';
|
||||||
onTap: () =>
|
|
||||||
presetMenuForWallet(wallet, isCurrentWallet, context),
|
if (isCurrentWallet) {
|
||||||
child: Container(
|
shortAddress = walletStore.subaddress.address;
|
||||||
padding: EdgeInsets.only(left: 10.0, right: 10.0),
|
shortAddress = shortAddress.replaceRange(4, shortAddress.length - 4, '...');
|
||||||
child: ListTile(
|
}
|
||||||
title: Text(
|
|
||||||
wallet.name,
|
final walletMenu = WalletMenu(context);
|
||||||
style: TextStyle(
|
final items = walletMenu.generateItemsForWalletMenu(isCurrentWallet);
|
||||||
color: isCurrentWallet
|
final colors = walletMenu.generateColorsForWalletMenu(isCurrentWallet);
|
||||||
? Palette.cakeGreen
|
final images = walletMenu.generateImagesForWalletMenu(isCurrentWallet);
|
||||||
: Theme.of(context)
|
|
||||||
.primaryTextTheme
|
return Container(
|
||||||
.headline
|
height: 108,
|
||||||
.color,
|
width: double.infinity,
|
||||||
fontSize: 18.0,
|
child: CustomScrollView(
|
||||||
fontWeight: FontWeight.w600),
|
scrollDirection: Axis.horizontal,
|
||||||
|
controller: scrollController,
|
||||||
|
slivers: <Widget>[
|
||||||
|
SliverPersistentHeader(
|
||||||
|
pinned: false,
|
||||||
|
floating: true,
|
||||||
|
delegate: WalletTile(
|
||||||
|
min: screenWidth - 228,
|
||||||
|
max: screenWidth,
|
||||||
|
image: moneroIcon,
|
||||||
|
walletName: wallet.name,
|
||||||
|
walletAddress: shortAddress,
|
||||||
|
isCurrent: isCurrentWallet
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SliverList(
|
||||||
|
delegate: SliverChildBuilderDelegate(
|
||||||
|
(context, index) {
|
||||||
|
|
||||||
|
final item = items[index];
|
||||||
|
final color = colors[index];
|
||||||
|
final image = images[index];
|
||||||
|
|
||||||
|
final radius = index == 0 ? 12.0 : 0.0;
|
||||||
|
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
scrollController.animateTo(0.0, duration: Duration(milliseconds: 500), curve: Curves.fastOutSlowIn);
|
||||||
|
walletMenu.action(
|
||||||
|
walletMenu.listItems.indexOf(item), wallet, isCurrentWallet);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
height: 108,
|
||||||
|
width: 108,
|
||||||
|
color: PaletteDark.historyPanel,
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.only(left: 5, right: 5),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(radius),
|
||||||
|
bottomLeft: Radius.circular(radius)
|
||||||
|
),
|
||||||
|
color: color
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: <Widget>[
|
||||||
|
image,
|
||||||
|
SizedBox(height: 5),
|
||||||
|
Text(
|
||||||
|
item,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
color: Colors.white
|
||||||
),
|
),
|
||||||
trailing: isCurrentWallet
|
|
||||||
? Icon(
|
|
||||||
Icons.check,
|
|
||||||
color: Palette.cakeGreen,
|
|
||||||
size: 20.0,
|
|
||||||
)
|
)
|
||||||
: null)));
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
childCount: items.length
|
||||||
|
)
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
bottomSection: Column(children: <Widget>[
|
bottomSection: Column(children: <Widget>[
|
||||||
PrimaryIconButton(
|
PrimaryImageButton(
|
||||||
onPressed: () => Navigator.of(context).pushNamed(Routes.newWallet),
|
onPressed: () => Navigator.of(context).pushNamed(Routes.newWallet),
|
||||||
iconData: Icons.add,
|
image: newWalletImage,
|
||||||
color: Theme.of(context).primaryTextTheme.button.backgroundColor,
|
text: S.of(context).wallet_list_create_new_wallet,
|
||||||
borderColor:
|
color: Colors.white,
|
||||||
Theme.of(context).primaryTextTheme.button.decorationColor,
|
textColor: PaletteDark.historyPanel),
|
||||||
iconColor: Palette.violet,
|
|
||||||
iconBackgroundColor: Theme.of(context).primaryIconTheme.color,
|
|
||||||
text: S.of(context).wallet_list_create_new_wallet),
|
|
||||||
SizedBox(height: 10.0),
|
SizedBox(height: 10.0),
|
||||||
PrimaryIconButton(
|
PrimaryImageButton(
|
||||||
onPressed: () =>
|
onPressed: () =>
|
||||||
Navigator.of(context).pushNamed(Routes.restoreWalletOptions),
|
Navigator.of(context).pushNamed(Routes.restoreWalletOptions),
|
||||||
iconData: Icons.refresh,
|
image: restoreWalletImage,
|
||||||
text: S.of(context).wallet_list_restore_wallet,
|
text: S.of(context).wallet_list_restore_wallet,
|
||||||
color: Theme.of(context).accentTextTheme.button.backgroundColor,
|
color: PaletteDark.historyPanelButton,
|
||||||
borderColor:
|
textColor: Colors.white)
|
||||||
Theme.of(context).accentTextTheme.button.decorationColor,
|
])),
|
||||||
iconColor: Theme.of(context).primaryTextTheme.caption.color,
|
)
|
||||||
iconBackgroundColor: Theme.of(context).accentIconTheme.color)
|
);
|
||||||
]));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,20 @@ class WalletMenu {
|
||||||
S.current.rescan
|
S.current.rescan
|
||||||
];
|
];
|
||||||
|
|
||||||
|
final List<Color> listColors = [
|
||||||
|
Colors.blue,
|
||||||
|
Colors.orange,
|
||||||
|
Colors.red,
|
||||||
|
Colors.green
|
||||||
|
];
|
||||||
|
|
||||||
|
final List<Image> listImages = [
|
||||||
|
Image.asset('assets/images/load.png', height: 32, width: 32, color: Colors.white),
|
||||||
|
Image.asset('assets/images/eye_action.png', height: 32, width: 32, color: Colors.white),
|
||||||
|
Image.asset('assets/images/trash.png', height: 32, width: 32, color: Colors.white),
|
||||||
|
Image.asset('assets/images/scanner.png', height: 32, width: 32, color: Colors.white)
|
||||||
|
];
|
||||||
|
|
||||||
List<String> generateItemsForWalletMenu(bool isCurrentWallet) {
|
List<String> generateItemsForWalletMenu(bool isCurrentWallet) {
|
||||||
final items = List<String>();
|
final items = List<String>();
|
||||||
|
|
||||||
|
@ -29,6 +43,28 @@ class WalletMenu {
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<Color> generateColorsForWalletMenu(bool isCurrentWallet) {
|
||||||
|
final colors = List<Color>();
|
||||||
|
|
||||||
|
if (!isCurrentWallet) colors.add(listColors[0]);
|
||||||
|
if (isCurrentWallet) colors.add(listColors[1]);
|
||||||
|
if (!isCurrentWallet) colors.add(listColors[2]);
|
||||||
|
if (isCurrentWallet) colors.add(listColors[3]);
|
||||||
|
|
||||||
|
return colors;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Image> generateImagesForWalletMenu(bool isCurrentWallet) {
|
||||||
|
final images = List<Image>();
|
||||||
|
|
||||||
|
if (!isCurrentWallet) images.add(listImages[0]);
|
||||||
|
if (isCurrentWallet) images.add(listImages[1]);
|
||||||
|
if (!isCurrentWallet) images.add(listImages[2]);
|
||||||
|
if (isCurrentWallet) images.add(listImages[3]);
|
||||||
|
|
||||||
|
return images;
|
||||||
|
}
|
||||||
|
|
||||||
void action(int index, WalletDescription wallet, bool isCurrentWallet) {
|
void action(int index, WalletDescription wallet, bool isCurrentWallet) {
|
||||||
final _walletListStore = Provider.of<WalletListStore>(context);
|
final _walletListStore = Provider.of<WalletListStore>(context);
|
||||||
|
|
||||||
|
|
135
lib/src/screens/wallet_list/widgets/wallet_tile.dart
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:cake_wallet/palette.dart';
|
||||||
|
|
||||||
|
class WalletTile extends SliverPersistentHeaderDelegate {
|
||||||
|
WalletTile({
|
||||||
|
@required this.min,
|
||||||
|
@required this.max,
|
||||||
|
@required this.image,
|
||||||
|
@required this.walletName,
|
||||||
|
@required this.walletAddress,
|
||||||
|
@required this.isCurrent
|
||||||
|
});
|
||||||
|
|
||||||
|
final double min;
|
||||||
|
final double max;
|
||||||
|
final Image image;
|
||||||
|
final String walletName;
|
||||||
|
final String walletAddress;
|
||||||
|
final bool isCurrent;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
|
||||||
|
|
||||||
|
double opacity = 1 - shrinkOffset / (max - min);
|
||||||
|
opacity = opacity >= 0 ? opacity : 0;
|
||||||
|
|
||||||
|
double panelWidth = 12 * opacity;
|
||||||
|
panelWidth = panelWidth < 12 ? 0 : 12;
|
||||||
|
|
||||||
|
final currentColor = isCurrent
|
||||||
|
? Colors.white
|
||||||
|
: PaletteDark.historyPanel;
|
||||||
|
|
||||||
|
return Stack(
|
||||||
|
fit: StackFit.expand,
|
||||||
|
overflow: Overflow.visible,
|
||||||
|
children: <Widget>[
|
||||||
|
Positioned(
|
||||||
|
top: 0,
|
||||||
|
right: max - 4,
|
||||||
|
child: Container(
|
||||||
|
height: 108,
|
||||||
|
width: 4,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.only(topRight: Radius.circular(4), bottomRight: Radius.circular(4)),
|
||||||
|
color: currentColor
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
top: 0,
|
||||||
|
right: 12,
|
||||||
|
child: Container(
|
||||||
|
height: 108,
|
||||||
|
width: max - 16,
|
||||||
|
padding: EdgeInsets.only(left: 20, right: 20),
|
||||||
|
color: PaletteDark.historyPanel,
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
image,
|
||||||
|
SizedBox(width: 10),
|
||||||
|
Text(
|
||||||
|
walletName,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 22,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: Colors.white
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
isCurrent ? SizedBox(height: 5) : Offstage(),
|
||||||
|
isCurrent
|
||||||
|
? Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
SizedBox(width: 34),
|
||||||
|
Text(
|
||||||
|
walletAddress,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
color: PaletteDark.walletCardText
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
: Offstage()
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
top: 0,
|
||||||
|
right: 0,
|
||||||
|
child: Opacity(
|
||||||
|
opacity: opacity,
|
||||||
|
child: Container(
|
||||||
|
height: 108,
|
||||||
|
width: panelWidth,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.only(topLeft: Radius.circular(12), bottomLeft: Radius.circular(12)),
|
||||||
|
gradient: LinearGradient(
|
||||||
|
begin: Alignment.topCenter,
|
||||||
|
end: Alignment.bottomCenter,
|
||||||
|
colors: [
|
||||||
|
PaletteDark.walletCardTopEndSync,
|
||||||
|
PaletteDark.walletCardBottomEndSync
|
||||||
|
]
|
||||||
|
)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
double get maxExtent => max;
|
||||||
|
|
||||||
|
@override
|
||||||
|
double get minExtent => min;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) => true;
|
||||||
|
|
||||||
|
}
|
|
@ -77,16 +77,16 @@ class WelcomePage extends BasePage {
|
||||||
text: S.of(context).create_new,
|
text: S.of(context).create_new,
|
||||||
color:
|
color:
|
||||||
Theme.of(context).primaryTextTheme.button.backgroundColor,
|
Theme.of(context).primaryTextTheme.button.backgroundColor,
|
||||||
borderColor:
|
textColor:
|
||||||
Theme.of(context).primaryTextTheme.button.decorationColor),
|
Theme.of(context).primaryTextTheme.button.color),
|
||||||
SizedBox(height: 10),
|
SizedBox(height: 10),
|
||||||
PrimaryButton(
|
PrimaryButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Navigator.pushNamed(context, Routes.restoreOptions);
|
Navigator.pushNamed(context, Routes.restoreOptions);
|
||||||
},
|
},
|
||||||
color: Theme.of(context).accentTextTheme.caption.backgroundColor,
|
color: Theme.of(context).accentTextTheme.caption.backgroundColor,
|
||||||
borderColor:
|
textColor:
|
||||||
Theme.of(context).accentTextTheme.caption.decorationColor,
|
Theme.of(context).primaryTextTheme.button.color,
|
||||||
text: S.of(context).restore_wallet,
|
text: S.of(context).restore_wallet,
|
||||||
)
|
)
|
||||||
]))
|
]))
|
||||||
|
|
174
lib/src/widgets/base_alert_dialog.dart
Normal file
|
@ -0,0 +1,174 @@
|
||||||
|
import 'dart:ui';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:cake_wallet/palette.dart';
|
||||||
|
|
||||||
|
class BaseAlertDialog extends StatelessWidget {
|
||||||
|
String get titleText => '';
|
||||||
|
String get contentText => '';
|
||||||
|
String get leftActionButtonText => '';
|
||||||
|
String get rightActionButtonText => '';
|
||||||
|
VoidCallback get actionLeft => () {};
|
||||||
|
VoidCallback get actionRight => () {};
|
||||||
|
|
||||||
|
Widget title(BuildContext context) {
|
||||||
|
return Text(
|
||||||
|
titleText,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.white,
|
||||||
|
decoration: TextDecoration.none,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget content(BuildContext context) {
|
||||||
|
return Text(
|
||||||
|
contentText,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.white,
|
||||||
|
decoration: TextDecoration.none,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget actionButtons(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: 300,
|
||||||
|
height: 52,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomLeft: Radius.circular(24),
|
||||||
|
bottomRight: Radius.circular(24)
|
||||||
|
),
|
||||||
|
color: Colors.white
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
children: <Widget>[
|
||||||
|
Flexible(
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.only(left: 12, right: 12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(24)),
|
||||||
|
),
|
||||||
|
child: ButtonTheme(
|
||||||
|
minWidth: double.infinity,
|
||||||
|
child: FlatButton(
|
||||||
|
onPressed: actionLeft,
|
||||||
|
highlightColor: Colors.transparent,
|
||||||
|
splashColor: Colors.transparent,
|
||||||
|
child: Text(
|
||||||
|
leftActionButtonText,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.blue,
|
||||||
|
decoration: TextDecoration.none,
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
height: 52,
|
||||||
|
width: 1,
|
||||||
|
color: Colors.grey.withOpacity(0.2),
|
||||||
|
),
|
||||||
|
Flexible(
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.only(left: 12, right: 12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.only(bottomRight: Radius.circular(24)),
|
||||||
|
),
|
||||||
|
child: ButtonTheme(
|
||||||
|
minWidth: double.infinity,
|
||||||
|
child: FlatButton(
|
||||||
|
onPressed: actionRight,
|
||||||
|
highlightColor: Colors.transparent,
|
||||||
|
splashColor: Colors.transparent,
|
||||||
|
child: Text(
|
||||||
|
rightActionButtonText,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.red,
|
||||||
|
decoration: TextDecoration.none,
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: () => Navigator.of(context).pop(),
|
||||||
|
child: Container(
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: BackdropFilter(
|
||||||
|
filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0),
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(color: PaletteDark.historyPanel.withOpacity(0.75)),
|
||||||
|
child: Center(
|
||||||
|
child: GestureDetector(
|
||||||
|
onTap: () => null,
|
||||||
|
child: Container(
|
||||||
|
width: 300,
|
||||||
|
height: 257,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(24)),
|
||||||
|
color: PaletteDark.menuHeader
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
//mainAxisSize: MainAxisSize.max,
|
||||||
|
children: <Widget>[
|
||||||
|
Container(
|
||||||
|
width: 300,
|
||||||
|
height: 77,
|
||||||
|
padding: EdgeInsets.all(24),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(24),
|
||||||
|
topRight: Radius.circular(24)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: title(context),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: 300,
|
||||||
|
height: 1,
|
||||||
|
color: PaletteDark.menuList,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: 300,
|
||||||
|
height: 127,
|
||||||
|
padding: EdgeInsets.all(24),
|
||||||
|
child: Center(
|
||||||
|
child: content(context),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
actionButtons(context)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,14 +7,14 @@ class PrimaryButton extends StatelessWidget {
|
||||||
{@required this.onPressed,
|
{@required this.onPressed,
|
||||||
@required this.text,
|
@required this.text,
|
||||||
@required this.color,
|
@required this.color,
|
||||||
@required this.borderColor,
|
@required this.textColor,
|
||||||
this.isDisabled = false,
|
this.isDisabled = false,
|
||||||
this.onDisabledPressed});
|
this.onDisabledPressed});
|
||||||
|
|
||||||
final VoidCallback onPressed;
|
final VoidCallback onPressed;
|
||||||
final VoidCallback onDisabledPressed;
|
final VoidCallback onDisabledPressed;
|
||||||
final Color color;
|
final Color color;
|
||||||
final Color borderColor;
|
final Color textColor;
|
||||||
final String text;
|
final String text;
|
||||||
final bool isDisabled;
|
final bool isDisabled;
|
||||||
|
|
||||||
|
@ -22,21 +22,21 @@ class PrimaryButton extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ButtonTheme(
|
return ButtonTheme(
|
||||||
minWidth: double.infinity,
|
minWidth: double.infinity,
|
||||||
height: 56.0,
|
height: 52.0,
|
||||||
child: FlatButton(
|
child: FlatButton(
|
||||||
onPressed: isDisabled
|
onPressed: isDisabled
|
||||||
? (onDisabledPressed != null ? onDisabledPressed : null)
|
? (onDisabledPressed != null ? onDisabledPressed : null)
|
||||||
: onPressed,
|
: onPressed,
|
||||||
color: isDisabled ? Colors.transparent : color,
|
color: isDisabled ? Colors.transparent : color,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
side: BorderSide(color: borderColor),
|
borderRadius: BorderRadius.circular(26.0)),
|
||||||
borderRadius: BorderRadius.circular(10.0)),
|
|
||||||
child: Text(text,
|
child: Text(text,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 16.0,
|
fontSize: 15.0,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
color: isDisabled
|
color: isDisabled
|
||||||
? Palette.darkGrey
|
? Palette.darkGrey
|
||||||
: Theme.of(context).primaryTextTheme.button.color)),
|
: textColor)),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -143,29 +143,43 @@ class PrimaryImageButton extends StatelessWidget {
|
||||||
{@required this.onPressed,
|
{@required this.onPressed,
|
||||||
@required this.image,
|
@required this.image,
|
||||||
@required this.text,
|
@required this.text,
|
||||||
this.color = Palette.purple,
|
@required this.color,
|
||||||
this.borderColor = Palette.deepPink,
|
@required this.textColor});
|
||||||
this.iconColor = Colors.black});
|
|
||||||
|
|
||||||
final VoidCallback onPressed;
|
final VoidCallback onPressed;
|
||||||
final Image image;
|
final Image image;
|
||||||
final Color color;
|
final Color color;
|
||||||
final Color borderColor;
|
final Color textColor;
|
||||||
final Color iconColor;
|
|
||||||
final String text;
|
final String text;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ButtonTheme(
|
return ButtonTheme(
|
||||||
minWidth: double.infinity,
|
minWidth: double.infinity,
|
||||||
height: 58.0,
|
height: 52.0,
|
||||||
child: FlatButton(
|
child: FlatButton(
|
||||||
onPressed: onPressed,
|
onPressed: onPressed,
|
||||||
color: color,
|
color: color,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
side: BorderSide(color: borderColor),
|
borderRadius: BorderRadius.circular(26.0)),
|
||||||
borderRadius: BorderRadius.circular(12.0)),
|
child:Center(
|
||||||
child: Row(
|
child: Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: <Widget>[
|
||||||
|
image,
|
||||||
|
SizedBox(width: 15),
|
||||||
|
Text(
|
||||||
|
text,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: textColor
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
/*Row(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Container(
|
Container(
|
||||||
width: 28.0,
|
width: 28.0,
|
||||||
|
@ -192,7 +206,7 @@ class PrimaryImageButton extends StatelessWidget {
|
||||||
)
|
)
|
||||||
]))
|
]))
|
||||||
],
|
],
|
||||||
),
|
),*/
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -337,10 +337,10 @@ class SeedWidgetState extends State<SeedWidget> {
|
||||||
.primaryTextTheme
|
.primaryTextTheme
|
||||||
.button
|
.button
|
||||||
.backgroundColor,
|
.backgroundColor,
|
||||||
borderColor: Theme.of(context)
|
textColor: Theme.of(context)
|
||||||
.primaryTextTheme
|
.primaryTextTheme
|
||||||
.button
|
.button
|
||||||
.decorationColor)
|
.color)
|
||||||
: PrimaryButton(
|
: PrimaryButton(
|
||||||
text: selectedItem != null
|
text: selectedItem != null
|
||||||
? S.of(context).save
|
? S.of(context).save
|
||||||
|
@ -351,7 +351,10 @@ class SeedWidgetState extends State<SeedWidget> {
|
||||||
onDisabledPressed: () => showErrorIfExist(),
|
onDisabledPressed: () => showErrorIfExist(),
|
||||||
isDisabled: !isCurrentMnemoticValid,
|
isDisabled: !isCurrentMnemoticValid,
|
||||||
color: PaletteDark.darkThemeBlueButton,
|
color: PaletteDark.darkThemeBlueButton,
|
||||||
borderColor: Palette.brightBlue))
|
textColor: Theme.of(context)
|
||||||
|
.primaryTextTheme
|
||||||
|
.button
|
||||||
|
.color))
|
||||||
]))
|
]))
|
||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
|
|