Skip to content
Merged
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
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