Skip to content

Commit a0f6ee4

Browse files
committed
implement multiple select and torrent content bloc
1 parent d7066ff commit a0f6ee4

9 files changed

+457
-107
lines changed

lib/Blocs/bloc_observer.dart

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import 'package:bloc/bloc.dart';
2+
3+
class SimpleBlocObserver extends BlocObserver {
4+
@override
5+
void onCreate(BlocBase<dynamic> bloc) {
6+
super.onCreate(bloc);
7+
print('Bloc created: ${bloc.runtimeType}');
8+
}
9+
10+
@override
11+
void onEvent(Bloc<dynamic, dynamic> bloc, Object? event) {
12+
super.onEvent(bloc, event);
13+
print('Bloc event: ${bloc.runtimeType}, Event: $event');
14+
}
15+
16+
@override
17+
void onChange(BlocBase<dynamic> bloc, Change<dynamic> change) {
18+
super.onChange(bloc, change);
19+
print('Bloc state change: ${bloc.runtimeType}, Change: $change');
20+
}
21+
22+
@override
23+
void onTransition(
24+
Bloc<dynamic, dynamic> bloc, Transition<dynamic, dynamic> transition) {
25+
super.onTransition(bloc, transition);
26+
print('Bloc transition: ${bloc.runtimeType}, Transition: $transition');
27+
}
28+
29+
@override
30+
void onError(BlocBase<dynamic> bloc, Object error, StackTrace stackTrace) {
31+
super.onError(bloc, error, stackTrace);
32+
print('Bloc error: ${bloc.runtimeType}, Error: $error');
33+
}
34+
35+
@override
36+
void onClose(BlocBase<dynamic> bloc) {
37+
super.onClose(bloc);
38+
print('Bloc closed: ${bloc.runtimeType}');
39+
}
40+
}

lib/Blocs/bloc_provider_list.dart

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import 'package:flutter_bloc/flutter_bloc.dart';
2+
import 'package:flood_mobile/Blocs/api_bloc/api_bloc.dart';
3+
import 'package:flood_mobile/Blocs/filter_torrent_bloc/filter_torrent_bloc.dart';
4+
import 'package:flood_mobile/Blocs/home_screen_bloc/home_screen_bloc.dart';
5+
import 'package:flood_mobile/Blocs/login_screen_bloc/login_screen_bloc.dart';
6+
import 'package:flood_mobile/Blocs/multiple_select_torrent_bloc/multiple_select_torrent_bloc.dart';
7+
import 'package:flood_mobile/Blocs/onboarding_main_page_bloc/on_boarding_page_color_bloc.dart';
8+
import 'package:flood_mobile/Blocs/sse_bloc/sse_bloc.dart';
9+
import 'package:flood_mobile/Blocs/theme_bloc/theme_bloc.dart';
10+
import 'package:flood_mobile/Blocs/torrent_content_screen_bloc/torrent_content_screen_bloc.dart';
11+
import 'package:flood_mobile/Blocs/user_detail_bloc/user_detail_bloc.dart';
12+
import 'package:flood_mobile/Blocs/client_settings_bloc/client_settings_bloc.dart';
13+
import 'package:flood_mobile/Blocs/graph_bloc/graph_bloc.dart';
14+
15+
class BlocProviders {
16+
static List<BlocProvider> multiBlocProviders = [
17+
BlocProvider<ClientSettingsBloc>(
18+
create: (context) => ClientSettingsBloc(),
19+
lazy: false,
20+
),
21+
BlocProvider<ThemeBloc>(
22+
create: (context) => ThemeBloc(),
23+
),
24+
BlocProvider<SSEBloc>(
25+
create: (context) => SSEBloc(),
26+
),
27+
BlocProvider<HomeScreenBloc>(
28+
create: (context) => HomeScreenBloc(),
29+
),
30+
BlocProvider<UserDetailBloc>(
31+
create: (context) => UserDetailBloc(),
32+
),
33+
BlocProvider<ApiBloc>(
34+
create: (context) => ApiBloc(),
35+
),
36+
BlocProvider<LoginScreenBloc>(
37+
create: (context) => LoginScreenBloc(),
38+
),
39+
BlocProvider<TorrentContentScreenBloc>(
40+
create: (context) => TorrentContentScreenBloc(),
41+
),
42+
BlocProvider<MultipleSelectTorrentBloc>(
43+
create: (context) => MultipleSelectTorrentBloc(),
44+
),
45+
BlocProvider<SpeedGraphBloc>(
46+
create: (context) => SpeedGraphBloc(),
47+
),
48+
BlocProvider<FilterTorrentBloc>(
49+
create: (context) => FilterTorrentBloc(),
50+
),
51+
BlocProvider<OnBoardingPageColorBloc>(
52+
create: (context) => OnBoardingPageColorBloc(),
53+
),
54+
];
55+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import 'package:bloc/bloc.dart';
2+
import 'package:equatable/equatable.dart';
3+
import 'package:flood_mobile/Model/torrent_model.dart';
4+
5+
part 'multiple_select_torrent_event.dart';
6+
part 'multiple_select_torrent_state.dart';
7+
8+
class MultipleSelectTorrentBloc
9+
extends Bloc<MultipleSelectTorrentEvent, MultipleSelectTorrentState> {
10+
MultipleSelectTorrentBloc() : super(InitialMultipleSelectTorrentState()) {
11+
on<ChangeSelectionModeEvent>(_changeSelectionMode);
12+
on<AddItemToListEvent>(_addItemToList);
13+
on<RemoveItemFromListEvent>(_removeItemFromList);
14+
on<AddAllItemsToListEvent>(_addAllItemsToList);
15+
on<RemoveAllItemsFromListEvent>(_removeAllItemsFromList);
16+
on<AddIndexToListEvent>(_addIndexToList);
17+
on<RemoveIndexFromListEvent>(_removeIndexFromList);
18+
on<AddAllIndexToListEvent>(_addAllIndexToList);
19+
on<RemoveAllIndexFromListEvent>(_removeAllIndexFromList);
20+
}
21+
22+
// Handle the ChangeSelectionMode event
23+
void _changeSelectionMode(ChangeSelectionModeEvent event,
24+
Emitter<MultipleSelectTorrentState> emit) {
25+
emit(state.copyWith(isSelectionMode: !state.isSelectionMode));
26+
}
27+
28+
// Handle the AddItemToList event
29+
void _addItemToList(
30+
AddItemToListEvent event, Emitter<MultipleSelectTorrentState> emit) {
31+
final updatedList = List<TorrentModel>.from(state.selectedTorrentList)
32+
..add(event.model);
33+
emit(state.copyWith(selectedTorrentList: updatedList));
34+
}
35+
36+
// Handle the RemoveItemFromList event
37+
void _removeItemFromList(
38+
RemoveItemFromListEvent event, Emitter<MultipleSelectTorrentState> emit) {
39+
final updatedList = List<TorrentModel>.from(state.selectedTorrentList)
40+
..removeWhere((element) => element.hash == event.model.hash);
41+
emit(state.copyWith(selectedTorrentList: updatedList));
42+
}
43+
44+
// Handle the AddAllItemsToList event
45+
void _addAllItemsToList(
46+
AddAllItemsToListEvent event, Emitter<MultipleSelectTorrentState> emit) {
47+
final updatedList = List<TorrentModel>.from(state.selectedTorrentList)
48+
..addAll(event.models);
49+
emit(state.copyWith(selectedTorrentList: updatedList));
50+
}
51+
52+
// Handle the RemoveAllItemsFromList event
53+
void _removeAllItemsFromList(RemoveAllItemsFromListEvent event,
54+
Emitter<MultipleSelectTorrentState> emit) {
55+
emit(state.copyWith(selectedTorrentList: []));
56+
}
57+
58+
// Handle the AddIndexToList event
59+
void _addIndexToList(
60+
AddIndexToListEvent event, Emitter<MultipleSelectTorrentState> emit) {
61+
final updatedList = List<int>.from(state.selectedTorrentIndex)
62+
..addAll(event.index
63+
.where((element) => !state.selectedTorrentIndex.contains(element)));
64+
emit(state.copyWith(selectedTorrentIndex: updatedList));
65+
}
66+
67+
// Handle the RemoveIndexFromList event
68+
void _removeIndexFromList(RemoveIndexFromListEvent event,
69+
Emitter<MultipleSelectTorrentState> emit) {
70+
final updatedList = List<int>.from(state.selectedTorrentIndex)
71+
..removeWhere((element) => event.index.contains(element));
72+
emit(state.copyWith(selectedTorrentIndex: updatedList));
73+
}
74+
75+
// Handle the AddAllIndexToList event
76+
void _addAllIndexToList(
77+
AddAllIndexToListEvent event, Emitter<MultipleSelectTorrentState> emit) {
78+
final updatedList = List<int>.from(state.selectedTorrentIndex)
79+
..addAll(event.index);
80+
emit(state.copyWith(selectedTorrentIndex: updatedList));
81+
}
82+
83+
// Handle the RemoveAllIndexFromList event
84+
void _removeAllIndexFromList(RemoveAllIndexFromListEvent event,
85+
Emitter<MultipleSelectTorrentState> emit) {
86+
emit(state.copyWith(selectedTorrentIndex: []));
87+
}
88+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
part of 'multiple_select_torrent_bloc.dart';
2+
3+
abstract class MultipleSelectTorrentEvent extends Equatable {
4+
const MultipleSelectTorrentEvent();
5+
6+
@override
7+
List<Object> get props => [];
8+
}
9+
10+
class ChangeSelectionModeEvent extends MultipleSelectTorrentEvent {}
11+
12+
class AddItemToListEvent extends MultipleSelectTorrentEvent {
13+
final TorrentModel model;
14+
15+
const AddItemToListEvent({required this.model});
16+
17+
@override
18+
List<Object> get props => [model];
19+
}
20+
21+
class RemoveItemFromListEvent extends MultipleSelectTorrentEvent {
22+
final TorrentModel model;
23+
24+
const RemoveItemFromListEvent({required this.model});
25+
26+
@override
27+
List<Object> get props => [model];
28+
}
29+
30+
class AddAllItemsToListEvent extends MultipleSelectTorrentEvent {
31+
final List<TorrentModel> models;
32+
33+
const AddAllItemsToListEvent({required this.models});
34+
35+
@override
36+
List<Object> get props => [models];
37+
}
38+
39+
class RemoveAllItemsFromListEvent extends MultipleSelectTorrentEvent {}
40+
41+
class AddIndexToListEvent extends MultipleSelectTorrentEvent {
42+
final List<int> index;
43+
44+
const AddIndexToListEvent({required this.index});
45+
46+
@override
47+
List<Object> get props => [index];
48+
}
49+
50+
class RemoveIndexFromListEvent extends MultipleSelectTorrentEvent {
51+
final List<int> index;
52+
53+
const RemoveIndexFromListEvent({required this.index});
54+
55+
@override
56+
List<Object> get props => [index];
57+
}
58+
59+
class AddAllIndexToListEvent extends MultipleSelectTorrentEvent {
60+
final List<int> index;
61+
62+
const AddAllIndexToListEvent({required this.index});
63+
64+
@override
65+
List<Object> get props => [index];
66+
}
67+
68+
class RemoveAllIndexFromListEvent extends MultipleSelectTorrentEvent {}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// ignore_for_file: must_be_immutable
2+
3+
part of 'multiple_select_torrent_bloc.dart';
4+
5+
class MultipleSelectTorrentState extends Equatable {
6+
final bool isSelectionMode;
7+
List<TorrentModel> selectedTorrentList;
8+
List<int> selectedTorrentIndex;
9+
10+
MultipleSelectTorrentState({
11+
required this.isSelectionMode,
12+
required this.selectedTorrentList,
13+
required this.selectedTorrentIndex,
14+
});
15+
16+
@override
17+
List<Object> get props =>
18+
[isSelectionMode, selectedTorrentList, selectedTorrentIndex];
19+
20+
MultipleSelectTorrentState copyWith({
21+
bool? isSelectionMode,
22+
List<TorrentModel>? selectedTorrentList,
23+
List<int>? selectedTorrentIndex,
24+
}) {
25+
return MultipleSelectTorrentState(
26+
isSelectionMode: isSelectionMode ?? this.isSelectionMode,
27+
selectedTorrentList: selectedTorrentList ?? this.selectedTorrentList,
28+
selectedTorrentIndex: selectedTorrentIndex ?? this.selectedTorrentIndex,
29+
);
30+
}
31+
}
32+
33+
class InitialMultipleSelectTorrentState extends MultipleSelectTorrentState {
34+
InitialMultipleSelectTorrentState()
35+
: super(
36+
isSelectionMode: false,
37+
selectedTorrentList: [],
38+
selectedTorrentIndex: [],
39+
);
40+
@override
41+
List<Object> get props =>
42+
[isSelectionMode, selectedTorrentList, selectedTorrentIndex];
43+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import 'package:bloc/bloc.dart';
2+
import 'package:equatable/equatable.dart';
3+
import 'package:flood_mobile/Model/torrent_content_model.dart';
4+
5+
part 'torrent_content_screen_event.dart';
6+
part 'torrent_content_screen_state.dart';
7+
8+
class TorrentContentScreenBloc
9+
extends Bloc<TorrentContentScreenEvent, TorrentContentScreenState> {
10+
TorrentContentScreenBloc() : super(InitialTorrentContentState()) {
11+
on<SetSelectionModeEvent>(_setSelectionMode);
12+
on<SetTorrentContentListEvent>(_setTorrentContentList);
13+
on<AddItemToSelectedIndexEvent>(_addItemToSelectedIndex);
14+
on<RemoveItemFromSelectedListEvent>(_removeItemFromSelectedList);
15+
on<RemoveAllItemsFromListEvent>(_removeAllItemsFromList);
16+
}
17+
18+
// Handle the SetSelectionMode event
19+
void _setSelectionMode(
20+
SetSelectionModeEvent event,
21+
Emitter<TorrentContentScreenState> emit,
22+
) {
23+
emit(state.copyWith(isSelectionMode: event.newIsSelected));
24+
}
25+
26+
// Handle the SetTorrentContentList event
27+
void _setTorrentContentList(
28+
SetTorrentContentListEvent event,
29+
Emitter<TorrentContentScreenState> emit,
30+
) {
31+
emit(state.copyWith(torrentContentList: event.newTorrentContentList));
32+
}
33+
34+
// Handle the AddItemToSelectedIndex event
35+
void _addItemToSelectedIndex(
36+
AddItemToSelectedIndexEvent event,
37+
Emitter<TorrentContentScreenState> emit,
38+
) {
39+
final updatedList = List<int>.from(state.selectedIndexList)
40+
..add(event.index);
41+
emit(state.copyWith(selectedIndexList: updatedList));
42+
}
43+
44+
// Handle the RemoveItemFromSelectedList event
45+
void _removeItemFromSelectedList(
46+
RemoveItemFromSelectedListEvent event,
47+
Emitter<TorrentContentScreenState> emit,
48+
) {
49+
final updatedList = List<int>.from(state.selectedIndexList)
50+
..remove(event.index);
51+
emit(state.copyWith(selectedIndexList: updatedList));
52+
}
53+
54+
// Handle the RemoveAllItemsFromList event
55+
void _removeAllItemsFromList(
56+
RemoveAllItemsFromListEvent event,
57+
Emitter<TorrentContentScreenState> emit,
58+
) {
59+
emit(state.copyWith(selectedIndexList: []));
60+
}
61+
}

0 commit comments

Comments
 (0)