Skip to content

Commit

Permalink
Added initial materials page
Browse files Browse the repository at this point in the history
  • Loading branch information
Wolfteam committed Mar 14, 2021
1 parent 833388c commit ff01cab
Show file tree
Hide file tree
Showing 7 changed files with 305 additions and 14 deletions.
11 changes: 7 additions & 4 deletions lib/presentation/characters/widgets/character_card.dart
Expand Up @@ -26,6 +26,7 @@ class CharacterCard extends StatelessWidget {
final bool isComingSoon;
final List<String> materials;
final bool isInSelectionMode;
final bool showMaterials;

const CharacterCard({
Key key,
Expand All @@ -39,6 +40,7 @@ class CharacterCard extends StatelessWidget {
@required this.isComingSoon,
@required this.materials,
this.isInSelectionMode = false,
this.showMaterials = true,
}) : super(key: key);

@override
Expand Down Expand Up @@ -98,10 +100,11 @@ class CharacterCard extends StatelessWidget {
),
),
Rarity(stars: rarity),
CharacterCardAscensionMaterialsBottom(
materials: materials,
weaponType: weaponType,
),
if (showMaterials)
CharacterCardAscensionMaterialsBottom(
materials: materials,
weaponType: weaponType,
),
],
),
),
Expand Down
11 changes: 7 additions & 4 deletions lib/presentation/home/home_page.dart
Expand Up @@ -2,15 +2,16 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:genshindb/application/bloc.dart';
import 'package:genshindb/generated/l10n.dart';
import 'package:genshindb/presentation/home/widgets/sliver_tierlist_card.dart';
import 'package:genshindb/presentation/today_materials/materials_page.dart';
import 'package:genshindb/presentation/today_materials/today_materials_page.dart';

import 'widgets/sliver_calculators_card.dart';
import 'widgets/sliver_characters_birthday_card.dart';
import 'widgets/sliver_elements_card.dart';
import 'widgets/sliver_game_codes_card.dart';
import 'widgets/sliver_main_title.dart';
import 'widgets/sliver_materials_card.dart';
import 'widgets/sliver_settings_card.dart';
import 'widgets/sliver_tierlist_card.dart';
import 'widgets/sliver_today_char_ascension_materials.dart';
import 'widgets/sliver_today_weapon_materials.dart';
import 'widgets/sliver_wish_simulator_card.dart';
Expand Down Expand Up @@ -39,6 +40,8 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin<
SliverTodayWeaponMaterials(),
SliverMainTitle(title: s.elements),
SliverElementsCard(),
SliverMainTitle(title: s.materials),
SliverMaterialsCard(),
SliverMainTitle(title: s.calculators),
SliverCalculatorsCard(),
SliverMainTitle(title: s.wishSimulator),
Expand Down Expand Up @@ -81,7 +84,7 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin<
}

Future<void> _gotoMaterialsPage(BuildContext context) async {
context.read<MaterialsBloc>().add(const MaterialsEvent.init());
await Navigator.push(context, MaterialPageRoute(builder: (_) => MaterialsPage()));
context.read<TodayMaterialsBloc>().add(const TodayMaterialsEvent.init());
await Navigator.push(context, MaterialPageRoute(builder: (_) => TodayMaterialsPage()));
}
}
32 changes: 32 additions & 0 deletions lib/presentation/home/widgets/sliver_materials_card.dart
@@ -0,0 +1,32 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:genshindb/application/bloc.dart';
import 'package:genshindb/domain/assets.dart';
import 'package:genshindb/generated/l10n.dart';
import 'package:genshindb/presentation/materials/materials_page.dart';

import 'sliver_card_item.dart';

class SliverMaterialsCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final s = S.of(context);
return SliverCardItem(
onClick: _gotoMaterialsPage,
icon: Image.asset(Assets.getOtherMaterialPath('bag.png'), width: 60, height: 60, color: theme.accentColor),
children: [
Text(
s.checkAllMaterials,
style: theme.textTheme.subtitle2,
textAlign: TextAlign.center,
),
],
);
}

Future<void> _gotoMaterialsPage(BuildContext context) async {
context.read<MaterialsBloc>().add(const MaterialsEvent.init());
await Navigator.push(context, MaterialPageRoute(builder: (_) => MaterialsPage()));
}
}
8 changes: 2 additions & 6 deletions lib/presentation/home/widgets/sliver_wish_simulator_card.dart
Expand Up @@ -12,13 +12,9 @@ class SliverWishSimulatorCard extends StatelessWidget {
final s = S.of(context);
return SliverCardItem(
onClick: _gotoWishSimulatorPage,
icon: Image.asset(
Assets.getCurrencyMaterialPath('acquaint_fate.png'),
width: 70,
height: 70,
),
icon: Image.asset(Assets.getOtherMaterialPath('gacha.png'), width: 60, height: 60, color: theme.accentColor),
children: [
Text(s.tryYourLuck, style: theme.textTheme.subtitle2, textAlign: TextAlign.right),
Text(s.tryYourLuck, style: theme.textTheme.subtitle2, textAlign: TextAlign.center),
],
);
}
Expand Down
65 changes: 65 additions & 0 deletions lib/presentation/materials/materials_page.dart
@@ -0,0 +1,65 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:genshindb/application/bloc.dart';
import 'package:genshindb/generated/l10n.dart';
import 'package:genshindb/presentation/shared/loading.dart';
import 'package:genshindb/presentation/shared/sliver_nothing_found.dart';
import 'package:genshindb/presentation/shared/sliver_page_filter.dart';
import 'package:genshindb/presentation/shared/sliver_scaffold_with_fab.dart';
import 'package:genshindb/presentation/shared/styles.dart';

import 'widgets/material_bottom_sheet.dart';
import 'widgets/material_card.dart';

class MaterialsPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final s = S.of(context);
final isPortrait = MediaQuery.of(context).orientation == Orientation.portrait;
return BlocBuilder<MaterialsBloc, MaterialsState>(
builder: (context, state) {
return state.map(
loading: (_) => const Loading(),
loaded: (state) => SafeArea(
child: SliverScaffoldWithFab(
appbar: AppBar(title: Text(s.materials)),
slivers: [
SliverPageFilter(
search: state.search,
title: s.materials,
onPressed: () => _showFiltersModal(context),
searchChanged: (v) => context.read<MaterialsBloc>().add(MaterialsEvent.searchChanged(search: v)),
),
if (state.materials.isNotEmpty)
SliverPadding(
padding: Styles.edgeInsetHorizontal5,
sliver: SliverStaggeredGrid.countBuilder(
crossAxisCount: isPortrait ? 3 : 5,
itemBuilder: (ctx, index) => MaterialCard.item(item: state.materials[index]),
itemCount: state.materials.length,
crossAxisSpacing: isPortrait ? 10 : 5,
mainAxisSpacing: 5,
staggeredTileBuilder: (int index) => const StaggeredTile.fit(1),
),
)
else
const SliverNothingFound(),
],
),
),
);
},
);
}

Future<void> _showFiltersModal(BuildContext context) async {
await showModalBottomSheet(
context: context,
shape: Styles.modalBottomSheetShape,
isDismissible: true,
isScrollControlled: true,
builder: (_) => MaterialBottomSheet(),
);
}
}
80 changes: 80 additions & 0 deletions lib/presentation/materials/widgets/material_bottom_sheet.dart
@@ -0,0 +1,80 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:genshindb/application/bloc.dart';
import 'package:genshindb/domain/enums/enums.dart';
import 'package:genshindb/domain/enums/material_type.dart' as mat;
import 'package:genshindb/generated/l10n.dart';
import 'package:genshindb/presentation/shared/common_bottom_sheet.dart';
import 'package:genshindb/presentation/shared/extensions/i18n_extensions.dart';
import 'package:genshindb/presentation/shared/genshin_db_icons.dart';
import 'package:genshindb/presentation/shared/item_popupmenu_filter.dart';
import 'package:genshindb/presentation/shared/loading.dart';
import 'package:genshindb/presentation/shared/rarity_rating.dart';
import 'package:genshindb/presentation/shared/sort_direction_popupmenu_filter.dart';

class MaterialBottomSheet extends StatelessWidget {
final ignoredSubStats = [
mat.MaterialType.others,
mat.MaterialType.expWeapon,
mat.MaterialType.weaponPrimary,
];

@override
Widget build(BuildContext context) {
final s = S.of(context);

return CommonBottomSheet(
titleIcon: GenshinDb.filter,
title: s.filters,
onOk: () {
context.read<MaterialsBloc>().add(const MaterialsEvent.applyFilterChanges());
Navigator.pop(context);
},
onCancel: () {
context.read<MaterialsBloc>().add(const MaterialsEvent.cancelChanges());
Navigator.pop(context);
},
child: BlocBuilder<MaterialsBloc, MaterialsState>(
builder: (context, state) => state.map(
loading: (_) => const Loading(),
loaded: (state) => Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text(s.rarity),
RarityRating(
rarity: state.rarity,
onRated: (v) => context.read<MaterialsBloc>().add(MaterialsEvent.rarityChanged(v)),
),
Text(s.others),
ButtonBar(
alignment: MainAxisAlignment.spaceEvenly,
children: [
ItemPopupMenuFilter<mat.MaterialType>(
tooltipText: s.secondaryState,
onSelected: (v) => context.read<MaterialsBloc>().add(MaterialsEvent.typeChanged(v)),
selectedValue: state.tempType,
values: mat.MaterialType.values.where((el) => !ignoredSubStats.contains(el)).toList(),
itemText: (val) => s.translateMaterialType(val),
icon: const Icon(GenshinDb.sliders_h, size: 18),
),
ItemPopupMenuFilter<MaterialFilterType>(
tooltipText: s.sortBy,
onSelected: (v) => context.read<MaterialsBloc>().add(MaterialsEvent.filterTypeChanged(v)),
selectedValue: state.tempFilterType,
values: MaterialFilterType.values,
itemText: (val) => s.translateMaterialFilterType(val),
),
SortDirectionPopupMenuFilter(
selectedSortDirection: state.tempSortDirectionType,
onSelected: (v) => context.read<MaterialsBloc>().add(MaterialsEvent.sortDirectionTypeChanged(v)),
)
],
),
],
),
),
),
);
}
}
112 changes: 112 additions & 0 deletions lib/presentation/materials/widgets/material_card.dart
@@ -0,0 +1,112 @@
import 'package:flutter/material.dart';
import 'package:genshindb/domain/models/materials/material_card_model.dart';
import 'package:genshindb/presentation/shared/extensions/rarity_extensions.dart';
import 'package:genshindb/presentation/shared/gradient_card.dart';
import 'package:genshindb/presentation/shared/styles.dart';
import 'package:transparent_image/transparent_image.dart';

class MaterialCard extends StatelessWidget {
final String keyName;
final String name;
final String image;
final int rarity;
final double imgWidth;
final double imgHeight;
final bool withoutDetails;
final bool withElevation;
final int quantity;

const MaterialCard({
Key key,
@required this.keyName,
@required this.name,
@required this.image,
@required this.rarity,
this.imgWidth = 70,
this.imgHeight = 60,
this.withElevation = true,
}) : withoutDetails = false,
quantity = -1,
super(key: key);

MaterialCard.item({
Key key,
@required MaterialCardModel item,
this.imgWidth = 70,
this.imgHeight = 60,
this.withElevation = true,
}) : keyName = item.key,
name = item.name,
image = item.image,
rarity = item.rarity,
withoutDetails = false,
quantity = -1,
super(key: key);

const MaterialCard.withoutDetails({
Key key,
@required this.keyName,
@required this.image,
@required this.rarity,
}) : name = null,
imgWidth = 70,
imgHeight = 60,
withoutDetails = true,
withElevation = false,
quantity = -1,
super(key: key);

const MaterialCard.quantity({
Key key,
@required this.keyName,
@required this.image,
@required this.rarity,
@required this.quantity,
}) : name = null,
imgWidth = 70,
imgHeight = 60,
withoutDetails = true,
withElevation = false,
super(key: key);

@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return InkWell(
borderRadius: Styles.mainCardBorderRadius,
onTap: () {},
child: GradientCard(
clipBehavior: Clip.hardEdge,
shape: Styles.mainCardShape,
elevation: withElevation ? Styles.cardTenElevation : 0,
gradient: rarity.getRarityGradient(),
child: Padding(
padding: withoutDetails ? Styles.edgeInsetAll5 : Styles.edgeInsetAll10,
child: Column(
children: [
FadeInImage(
width: imgWidth,
height: imgHeight,
placeholder: MemoryImage(kTransparentImage),
image: AssetImage(image),
),
if (quantity >= 0) Text('$quantity', style: theme.textTheme.subtitle2),
if (!withoutDetails)
Center(
child: Tooltip(
message: name,
child: Text(
name,
textAlign: TextAlign.center,
style: theme.textTheme.subtitle1.copyWith(fontWeight: FontWeight.bold, color: Colors.white),
overflow: TextOverflow.ellipsis,
),
),
),
],
),
),
),
);
}
}

0 comments on commit ff01cab

Please sign in to comment.