Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 41 additions & 1 deletion lib/src/model/settings/board_preferences.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ class BoardPreferences extends Notifier<BoardPrefs> with PreferencesStorage<Boar
return save(state.copyWith(pieceSet: pieceSet));
}

Future<void> toggleEnable3dAssets(bool enable3dAssets) {
return save(
state.copyWith(enable3dAssets: enable3dAssets));
}

Future<void> setBoardTheme(BoardTheme boardTheme) async {
await save(state.copyWith(boardTheme: boardTheme));
}
Expand Down Expand Up @@ -139,6 +144,7 @@ sealed class BoardPrefs with _$BoardPrefs implements Serializable {
const factory BoardPrefs({
@JsonKey(defaultValue: PieceSet.cburnett, unknownEnumValue: PieceSet.cburnett)
required PieceSet pieceSet,
required bool enable3dAssets,
@JsonKey(defaultValue: BoardTheme.brown, unknownEnumValue: BoardTheme.brown)
required BoardTheme boardTheme,
bool? immersiveModeWhilePlaying,
Expand Down Expand Up @@ -185,6 +191,7 @@ sealed class BoardPrefs with _$BoardPrefs implements Serializable {

static const defaults = BoardPrefs(
pieceSet: PieceSet.cburnett,
enable3dAssets: false,
boardTheme: BoardTheme.brown,
immersiveModeWhilePlaying: false,
hapticFeedback: true,
Expand Down Expand Up @@ -287,7 +294,18 @@ enum BoardTheme {
purple('Purple', 'purple'),
purpleDiag('Purple-Diag', 'purple-diag'),
pinkPyramid('Pink', 'pink'),
horsey('Horsey', 'horsey');
horsey('Horsey', 'horsey'),
/// 3D boards
blackwhitealuminium('Black White Aluminium','blackwhitealuminium'),
chinablue('China Blue','chinablue'),
chinagreen('China Green','chinagreen'),
chinagrey('China Grey','chinagrey'),
chinascarlet('China Scarlet','chinascarlet'),
jade('Jade','jade'),
lightwood('Light Wood','lightwood'),
powercoated('Power Coated','powercoated'),
rosewood('Rosewood','rosewood'),
wax('Wax','wax');

final String label;
final String gifApiName;
Expand Down Expand Up @@ -348,6 +366,28 @@ enum BoardTheme {
return ChessboardColorScheme.pinkPyramid;
case BoardTheme.horsey:
return ChessboardColorScheme.horsey;

/// 3D Boards
case BoardTheme.blackwhitealuminium:
return ChessboardColorScheme.blackwhitealuminium;
case BoardTheme.chinablue:
return ChessboardColorScheme.chinablue;
case BoardTheme.chinagreen:
return ChessboardColorScheme.chinagreen;
case BoardTheme.chinagrey:
return ChessboardColorScheme.chinagrey;
case BoardTheme.chinascarlet:
return ChessboardColorScheme.chinascarlet;
case BoardTheme.rosewood:
return ChessboardColorScheme.rosewood;
case BoardTheme.powercoated:
return ChessboardColorScheme.powercoated;
case BoardTheme.lightwood:
return ChessboardColorScheme.lightwood;
case BoardTheme.jade:
return ChessboardColorScheme.jade;
case BoardTheme.wax:
return ChessboardColorScheme.wax;
}
}

Expand Down
2 changes: 2 additions & 0 deletions lib/src/utils/chessboard.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,5 @@ Future<void> precachePieceImages(PieceSet pieceSet) async {
debugPrint('Failed to preload piece images: $e');
}
}


103 changes: 89 additions & 14 deletions lib/src/view/settings/piece_set_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ class PieceSetScreen extends ConsumerStatefulWidget {
class _PieceSetScreenState extends ConsumerState<PieceSetScreen> {
bool isLoading = false;

Future<void> onChanged(PieceSet? value) async {
Future<void> onChanged(PieceSet? value, bool toggle3d) async {
if(toggle3d == null ){
ref.read(boardPreferencesProvider.notifier).toggleEnable3dAssets(toggle3d);
}
if (value != null) {
ref.read(boardPreferencesProvider.notifier).setPieceSet(value);
setState(() {
Expand All @@ -36,11 +39,12 @@ class _PieceSetScreenState extends ConsumerState<PieceSetScreen> {
setState(() {
isLoading = false;
});
}
}
}
}
}


List<AssetImage> getPieceImages(PieceSet set) {
return [
set.assets[PieceKind.whiteKing]!,
Expand All @@ -52,23 +56,45 @@ class _PieceSetScreenState extends ConsumerState<PieceSetScreen> {
];
}

List<AssetImage> get3DPieceImages(PieceSet set) {
return [
set.assets[PieceKind.whiteKing]!,
set.assets[PieceKind.blackQueen]!,
set.assets[PieceKind.whiteRook]!,
set.assets[PieceKind.blackBishop]!,
set.assets[PieceKind.whiteKnight]!,
set.assets[PieceKind.blackPawn]!,
];
}

@override
Widget build(BuildContext context) {
final boardPrefs = ref.watch(boardPreferencesProvider);

return PlatformScaffold(
appBar: PlatformAppBar(
title: Text(context.l10n.pieceSet),
actions: [if (isLoading) const PlatformAppBarLoadingIndicator()],
),
body: SafeArea(
return DefaultTabController(
length: 2,
child: PlatformScaffold(
appBar: PlatformAppBar(
title: Text(context.l10n.pieceSet),
actions: [if (isLoading) const PlatformAppBarLoadingIndicator()],
bottom: const TabBar(
tabs: [
Tab(text: '2D'), // TODO: Create i18n translations for these tabs
Tab(text: '3D'),
],
),
),
body: TabBarView(
children: [
Center(
child: SafeArea(
child: ListView.separated(
itemCount: PieceSet.values.length,
itemCount: PieceSet.pieceSets2d.length,
separatorBuilder: (_, _) => Theme.of(context).platform == TargetPlatform.iOS
? const PlatformDivider()
: const SizedBox.shrink(),
itemBuilder: (context, index) {
final pieceSet = PieceSet.values[index];
final pieceSet = PieceSet.pieceSets2d[index];
return ListTile(
trailing: boardPrefs.pieceSet == pieceSet ? const Icon(Icons.check) : null,
title: Text(pieceSet.label),
Expand All @@ -87,14 +113,63 @@ class _PieceSetScreenState extends ConsumerState<PieceSetScreen> {
],
),
],

),
),
onTap: isLoading ? null : () => onChanged(pieceSet, false),
selected: boardPrefs.pieceSet == pieceSet,
);
},
),
),
),

Center(
child: SafeArea(
child: ListView.separated(
itemCount: PieceSet.pieceSets3d.length,
separatorBuilder: (_, _) => Theme.of(context).platform == TargetPlatform.iOS
? const PlatformDivider()
: const SizedBox.shrink(),
itemBuilder: (context, index) {
final pieceSet = PieceSet.pieceSets3d[index];
return ListTile(
trailing: boardPrefs.pieceSet == pieceSet ? const Icon(Icons.check) : null,
title: Text(pieceSet.label),
subtitle: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 264),
child: Stack(
children: [
BrightnessHueFilter(
brightness: boardPrefs.brightness,
hue: boardPrefs.hue,
child: boardPrefs.boardTheme.thumbnail,
),
Wrap(
spacing: -3,
children: [
for (final img in get3DPieceImages(pieceSet))
Transform.translate(
offset: const Offset(0, -9),
child: Image(image: img, height: 60),
),
],
),
],
),
),
onTap: isLoading ? null : () => onChanged(pieceSet, true),
selected: boardPrefs.pieceSet == pieceSet,

);
},
),
),
onTap: isLoading ? null : () => onChanged(pieceSet),
selected: boardPrefs.pieceSet == pieceSet,
);
},
)
],
),
),
);
}
}

Loading