diff --git a/lib/data/models/node_list_cubit.dart b/lib/data/models/node_list_cubit.dart index fddb303b4daf749579f43c17b607c7086e07a52b..2e517e31c67de579022e249a5ea610b000aa2345 100644 --- a/lib/data/models/node_list_cubit.dart +++ b/lib/data/models/node_list_cubit.dart @@ -7,21 +7,55 @@ import 'node_type.dart'; class NodeListCubit extends HydratedCubit<NodeListState> { NodeListCubit() : super(NodeListState()); - void shuffle(NodeType type) { + void shuffle(NodeType type, bool withPenalty) { switch (type) { case NodeType.duniter: - emit(state.copyWith(duniterNodes: shuffleFirstN(state.duniterNodes))); + if (withPenalty) { + emit(state.copyWith( + duniterNodes: shuffleFirstNWithPenalty(state.duniterNodes))); + } else { + emit(state.copyWith(duniterNodes: shuffleFirstN(state.duniterNodes))); + } break; case NodeType.cesiumPlus: - emit(state.copyWith( - cesiumPlusNodes: shuffleFirstN(state.cesiumPlusNodes))); + if (withPenalty) { + emit(state.copyWith( + cesiumPlusNodes: shuffleFirstNWithPenalty( + state.cesiumPlusNodes))); + } else { + emit(state.copyWith( + cesiumPlusNodes: shuffleFirstN(state.cesiumPlusNodes))); + } break; case NodeType.gva: - emit(state.copyWith(gvaNodes: shuffleFirstN(state.gvaNodes))); + if (withPenalty) { + emit(state.copyWith( + gvaNodes: shuffleFirstNWithPenalty(state.gvaNodes))); + } else { + emit(state.copyWith(gvaNodes: shuffleFirstN(state.gvaNodes))); + } break; } } + // shuffle first n nodes, keeping the first node last + List<Node> shuffleFirstNWithPenalty(List<Node> list, [int n = 5]) { + if (list.length <= n) { + final Node firstElement = list.removeAt(0); + list.shuffle(); + list.add(firstElement); + } else { + final List<Node> subList = list.sublist(0, n); + final Node firstElement = subList.removeAt(0); + subList.shuffle(); + subList.add(firstElement); + for (int i = 0; i < n; i++) { + list[i] = subList[i]; + } + } + return list; + } + // shuffle fist n nodes List<Node> shuffleFirstN(List<Node> list, [int n = 5]) { if (list.length <= n) { diff --git a/lib/ui/widgets/fifth_screen/node_info.dart b/lib/ui/widgets/fifth_screen/node_info.dart index 0356c6d6a26f51b3cc4d3c4a9b21769ea0b88924..16d4095d0a6ef0a4bbd44e27339271e245866c68 100644 --- a/lib/ui/widgets/fifth_screen/node_info.dart +++ b/lib/ui/widgets/fifth_screen/node_info.dart @@ -26,7 +26,7 @@ class NodeInfoCard extends StatelessWidget { : state.gvaNodes; return GestureDetector( onTap: () { - context.read<NodeListCubit>().shuffle(type); + context.read<NodeListCubit>().shuffle(type, true); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(tr('long_press_to_refresh')),