Skip to content

Commit

Permalink
Merge pull request #1165 from lichess-org/board_settings
Browse files Browse the repository at this point in the history
Improve board settings
  • Loading branch information
veloce authored Nov 19, 2024
2 parents 52d1177 + 8f72e80 commit 4c55472
Show file tree
Hide file tree
Showing 10 changed files with 222 additions and 212 deletions.
14 changes: 14 additions & 0 deletions lib/src/model/settings/board_preferences.dart
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ class BoardPreferences extends _$BoardPreferences
);
}

Future<void> setDragTargetKind(DragTargetKind dragTargetKind) {
return save(state.copyWith(dragTargetKind: dragTargetKind));
}

Future<void> toggleShowMaterialDifference() {
return save(
state.copyWith(showMaterialDifference: !state.showMaterialDifference),
Expand Down Expand Up @@ -120,6 +124,8 @@ class BoardPrefs with _$BoardPrefs implements Serializable {
/// Whether to enable shape drawings on the board for games and puzzles.
@JsonKey(defaultValue: true) required bool enableShapeDrawings,
@JsonKey(defaultValue: true) required bool magnifyDraggedPiece,
@JsonKey(defaultValue: DragTargetKind.circle)
required DragTargetKind dragTargetKind,
@JsonKey(
defaultValue: ShapeColor.green,
unknownEnumValue: ShapeColor.green,
Expand All @@ -141,6 +147,7 @@ class BoardPrefs with _$BoardPrefs implements Serializable {
pieceShiftMethod: PieceShiftMethod.either,
enableShapeDrawings: true,
magnifyDraggedPiece: true,
dragTargetKind: DragTargetKind.circle,
shapeColor: ShapeColor.green,
showBorder: false,
);
Expand All @@ -161,6 +168,7 @@ class BoardPrefs with _$BoardPrefs implements Serializable {
animationDuration: pieceAnimationDuration,
dragFeedbackScale: magnifyDraggedPiece ? 2.0 : 1.0,
dragFeedbackOffset: Offset(0.0, magnifyDraggedPiece ? -1.0 : 0.0),
dragTargetKind: dragTargetKind,
pieceShiftMethod: pieceShiftMethod,
drawShape: DrawShapeOptions(
enable: enableShapeDrawings,
Expand Down Expand Up @@ -300,3 +308,9 @@ enum BoardTheme {
errorBuilder: (context, o, st) => const SizedBox.shrink(),
);
}

String dragTargetKindLabel(DragTargetKind kind) => switch (kind) {
DragTargetKind.circle => 'Circle',
DragTargetKind.square => 'Square',
DragTargetKind.none => 'None',
};
2 changes: 2 additions & 0 deletions lib/src/view/game/game_common_widgets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'package:lichess_mobile/src/model/lobby/game_seek.dart';
import 'package:lichess_mobile/src/network/http.dart';
import 'package:lichess_mobile/src/utils/l10n_context.dart';
import 'package:lichess_mobile/src/utils/share.dart';
import 'package:lichess_mobile/src/view/settings/toggle_sound_button.dart';
import 'package:lichess_mobile/src/widgets/adaptive_action_sheet.dart';
import 'package:lichess_mobile/src/widgets/adaptive_bottom_sheet.dart';
import 'package:lichess_mobile/src/widgets/buttons.dart';
Expand Down Expand Up @@ -64,6 +65,7 @@ class GameAppBar extends ConsumerWidget {
? _ChallengeGameTitle(challenge: challenge!)
: const SizedBox.shrink(),
actions: [
const ToggleSoundButton(),
if (id != null)
AppBarIconButton(
onPressed: () => showAdaptiveBottomSheet<void>(
Expand Down
68 changes: 12 additions & 56 deletions lib/src/view/game/game_settings.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:lichess_mobile/src/model/account/account_preferences.dart';
import 'package:lichess_mobile/src/model/common/id.dart';
import 'package:lichess_mobile/src/model/game/game_controller.dart';
import 'package:lichess_mobile/src/model/game/game_preferences.dart';
import 'package:lichess_mobile/src/model/settings/board_preferences.dart';
import 'package:lichess_mobile/src/model/settings/general_preferences.dart';
import 'package:lichess_mobile/src/utils/l10n_context.dart';
import 'package:lichess_mobile/src/utils/navigation.dart';
import 'package:lichess_mobile/src/view/settings/board_settings_screen.dart';
import 'package:lichess_mobile/src/widgets/adaptive_bottom_sheet.dart';
import 'package:lichess_mobile/src/widgets/list.dart';
import 'package:lichess_mobile/src/widgets/settings.dart';

import 'game_screen_providers.dart';
Expand All @@ -20,31 +20,11 @@ class GameSettings extends ConsumerWidget {

@override
Widget build(BuildContext context, WidgetRef ref) {
final isSoundEnabled = ref.watch(
generalPreferencesProvider.select(
(prefs) => prefs.isSoundEnabled,
),
);
final boardPrefs = ref.watch(boardPreferencesProvider);
final gamePrefs = ref.watch(gamePreferencesProvider);
final userPrefsAsync = ref.watch(userGamePrefsProvider(id));

return BottomSheetScrollableContainer(
children: [
SwitchSettingTile(
title: Text(context.l10n.sound),
value: isSoundEnabled,
onChanged: (value) {
ref.read(generalPreferencesProvider.notifier).toggleSoundEnabled();
},
),
SwitchSettingTile(
title: Text(context.l10n.mobileSettingsHapticFeedback),
value: boardPrefs.hapticFeedback,
onChanged: (value) {
ref.read(boardPreferencesProvider.notifier).toggleHapticFeedback();
},
),
...userPrefsAsync.maybeWhen(
data: (data) {
return [
Expand Down Expand Up @@ -85,39 +65,15 @@ class GameSettings extends ConsumerWidget {
},
orElse: () => [],
),
SwitchSettingTile(
// TODO: Add l10n
title: const Text('Shape drawing'),
subtitle: const Text(
'Draw shapes using two fingers.',
maxLines: 5,
textAlign: TextAlign.justify,
),
value: boardPrefs.enableShapeDrawings,
onChanged: (value) {
ref
.read(boardPreferencesProvider.notifier)
.toggleEnableShapeDrawings();
},
),
SwitchSettingTile(
title: Text(
context.l10n.preferencesPieceAnimation,
),
value: boardPrefs.pieceAnimation,
onChanged: (value) {
ref.read(boardPreferencesProvider.notifier).togglePieceAnimation();
},
),
SwitchSettingTile(
title: Text(
context.l10n.preferencesMaterialDifference,
),
value: boardPrefs.showMaterialDifference,
onChanged: (value) {
ref
.read(boardPreferencesProvider.notifier)
.toggleShowMaterialDifference();
PlatformListTile(
// TODO translate
title: const Text('Board settings'),
trailing: const Icon(CupertinoIcons.chevron_right),
onTap: () {
pushPlatformRoute(
context,
screen: const BoardSettingsScreen(),
);
},
),
SwitchSettingTile(
Expand Down
5 changes: 5 additions & 0 deletions lib/src/view/puzzle/puzzle_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import 'package:lichess_mobile/src/view/account/rating_pref_aware.dart';
import 'package:lichess_mobile/src/view/analysis/analysis_screen.dart';
import 'package:lichess_mobile/src/view/game/archived_game_screen.dart';
import 'package:lichess_mobile/src/view/puzzle/puzzle_settings_screen.dart';
import 'package:lichess_mobile/src/view/settings/toggle_sound_button.dart';
import 'package:lichess_mobile/src/widgets/adaptive_action_sheet.dart';
import 'package:lichess_mobile/src/widgets/adaptive_bottom_sheet.dart';
import 'package:lichess_mobile/src/widgets/adaptive_choice_picker.dart';
Expand Down Expand Up @@ -91,6 +92,7 @@ class _PuzzleScreenState extends ConsumerState<PuzzleScreen> with RouteAware {
child: PlatformScaffold(
appBar: PlatformAppBar(
actions: const [
ToggleSoundButton(),
_PuzzleSettingsButton(),
],
title: _Title(angle: widget.angle),
Expand Down Expand Up @@ -604,6 +606,9 @@ class _PuzzleSettingsButton extends StatelessWidget {
isDismissible: true,
isScrollControlled: true,
showDragHandle: true,
constraints: BoxConstraints(
minHeight: MediaQuery.sizeOf(context).height * 0.5,
),
builder: (_) => const PuzzleSettingsScreen(),
),
semanticsLabel: context.l10n.settingsSettings,
Expand Down
48 changes: 11 additions & 37 deletions lib/src/view/puzzle/puzzle_settings_screen.dart
Original file line number Diff line number Diff line change
@@ -1,64 +1,38 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:lichess_mobile/src/model/puzzle/puzzle_preferences.dart';
import 'package:lichess_mobile/src/model/settings/board_preferences.dart';
import 'package:lichess_mobile/src/model/settings/general_preferences.dart';
import 'package:lichess_mobile/src/utils/l10n_context.dart';
import 'package:lichess_mobile/src/utils/navigation.dart';
import 'package:lichess_mobile/src/view/settings/board_settings_screen.dart';
import 'package:lichess_mobile/src/widgets/adaptive_bottom_sheet.dart';
import 'package:lichess_mobile/src/widgets/list.dart';
import 'package:lichess_mobile/src/widgets/settings.dart';

class PuzzleSettingsScreen extends ConsumerWidget {
const PuzzleSettingsScreen({super.key});

@override
Widget build(BuildContext context, WidgetRef ref) {
final isSoundEnabled = ref.watch(
generalPreferencesProvider.select((pref) => pref.isSoundEnabled),
);
final autoNext = ref.watch(
puzzlePreferencesProvider.select((value) => value.autoNext),
);
final boardPrefs = ref.watch(boardPreferencesProvider);

return BottomSheetScrollableContainer(
children: [
SwitchSettingTile(
title: Text(context.l10n.sound),
value: isSoundEnabled,
onChanged: (value) {
ref.read(generalPreferencesProvider.notifier).toggleSoundEnabled();
},
),
SwitchSettingTile(
title: Text(context.l10n.puzzleJumpToNextPuzzleImmediately),
value: autoNext,
onChanged: (value) {
ref.read(puzzlePreferencesProvider.notifier).setAutoNext(value);
},
),
SwitchSettingTile(
// TODO: Add l10n
title: const Text('Shape drawing'),
subtitle: const Text(
'Draw shapes using two fingers.',
maxLines: 5,
textAlign: TextAlign.justify,
),
value: boardPrefs.enableShapeDrawings,
onChanged: (value) {
ref
.read(boardPreferencesProvider.notifier)
.toggleEnableShapeDrawings();
},
),
SwitchSettingTile(
title: Text(
context.l10n.preferencesPieceAnimation,
),
value: boardPrefs.pieceAnimation,
onChanged: (value) {
ref.read(boardPreferencesProvider.notifier).togglePieceAnimation();
PlatformListTile(
title: const Text('Board settings'),
trailing: const Icon(CupertinoIcons.chevron_right),
onTap: () {
pushPlatformRoute(
context,
screen: const BoardSettingsScreen(),
);
},
),
],
Expand Down
Loading

0 comments on commit 4c55472

Please sign in to comment.