Merge pull request #51 from cake-tech/CWA-201-update-wallet-menu-screen

Cwa 201 update wallet menu screen
This commit is contained in:
Oleksandr Sobol 2020-05-01 22:30:49 +03:00 committed by GitHub
commit 8d45f350b5
42 changed files with 725 additions and 267 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

BIN
assets/images/2.0x/load.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 913 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
assets/images/3.0x/load.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 B

BIN
assets/images/load.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

BIN
assets/images/scanner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 B

BIN
assets/images/trash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 B

View file

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

View file

@ -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))
], ],
)); ));
} }

View file

@ -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),
); );
} }

View file

@ -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))
], ],
); );*/
}); });
} }
} }

View file

@ -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;
}

View file

@ -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

View file

@ -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(

View file

@ -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(

View file

@ -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,

View file

@ -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(),

View file

@ -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),
) )
], ],
); );

View file

@ -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,
), ),
)), )),
], ],

View file

@ -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()
],
),
); );
} }
} }

View file

@ -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),
], ],
), ),
); );

View file

@ -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) );
]));
} }
} }

View file

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

View 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;
}

View file

@ -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,
) )
])) ]))

View 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)
],
),
),
),
),
),
),
),
);
}
}

View file

@ -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 {
) )
])) ]))
], ],
), ),*/
)); ));
} }
} }

View file

@ -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))
])) ]))
]), ]),
); );