Skip to content

Commit dfc46ed

Browse files
committed
Added select/deselect all button in recent page
1 parent 9bc76ae commit dfc46ed

File tree

8 files changed

+58
-1
lines changed

8 files changed

+58
-1
lines changed

lib/components/home/preview_card.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class _PreviewCardState extends State<PreviewCard> {
7878

7979
@override
8080
Widget build(BuildContext context) {
81+
expanded.value = widget.selected;
8182
final theme = Theme.of(context);
8283
final colorScheme = theme.colorScheme;
8384
final disableAnimations = MediaQuery.disableAnimationsOf(context);
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:saber/i18n/strings.g.dart';
3+
4+
class SelectAllNotesButton extends StatelessWidget {
5+
const SelectAllNotesButton({
6+
super.key,
7+
required this.selectedFiles,
8+
required this.allFiles,
9+
required this.selectAll,
10+
required this.deselectAll,
11+
});
12+
13+
final List<String> selectedFiles;
14+
final List<String> allFiles;
15+
final void Function() selectAll;
16+
final void Function() deselectAll;
17+
18+
bool get areAllFilesSelected {
19+
return selectedFiles.length == allFiles.length;
20+
}
21+
22+
@override
23+
Widget build(BuildContext context) {
24+
return IconButton(
25+
padding: EdgeInsets.zero,
26+
tooltip: areAllFilesSelected ? t.home.deselectAllNotes : t.home.selectAllNotes ,
27+
onPressed: () {
28+
if (areAllFilesSelected)
29+
deselectAll();
30+
else
31+
selectAll();
32+
},
33+
icon: Icon(areAllFilesSelected ? Icons.deselect : Icons.select_all),
34+
);
35+
}
36+
}

lib/i18n/strings.i18n.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ home:
4747
renamedTo: Note will be renamed to $newName
4848
multipleRenamedTo: "The following notes will be renamed:"
4949
numberRenamedTo: $n notes will be renamed to avoid conflicts
50+
selectAllNotes: Select all
51+
deselectAllNotes: Deselect all
5052
deleteNote: Delete note
5153
renameFolder:
5254
renameFolder: Rename folder

lib/i18n/strings_en.g.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ class TranslationsHomeEn {
7474
late final TranslationsHomeNewFolderEn newFolder = TranslationsHomeNewFolderEn.internal(_root);
7575
late final TranslationsHomeRenameNoteEn renameNote = TranslationsHomeRenameNoteEn.internal(_root);
7676
late final TranslationsHomeMoveNoteEn moveNote = TranslationsHomeMoveNoteEn.internal(_root);
77+
String get selectAllNotes => 'Select all';
78+
String get deselectAllNotes => 'Deselect all';
7779
String get deleteNote => 'Delete note';
7880
late final TranslationsHomeRenameFolderEn renameFolder = TranslationsHomeRenameFolderEn.internal(_root);
7981
late final TranslationsHomeDeleteFolderEn deleteFolder = TranslationsHomeDeleteFolderEn.internal(_root);

lib/i18n/strings_it.g.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ class _TranslationsHomeIt extends TranslationsHomeEn {
7171
@override late final _TranslationsHomeNewFolderIt newFolder = _TranslationsHomeNewFolderIt._(_root);
7272
@override late final _TranslationsHomeRenameNoteIt renameNote = _TranslationsHomeRenameNoteIt._(_root);
7373
@override late final _TranslationsHomeMoveNoteIt moveNote = _TranslationsHomeMoveNoteIt._(_root);
74+
@override String get selectAllNotes => 'Seleziona tutto';
75+
@override String get deselectAllNotes => 'Deseleziona tutto';
7476
@override String get deleteNote => 'Elimina nota';
7577
@override late final _TranslationsHomeRenameFolderIt renameFolder = _TranslationsHomeRenameFolderIt._(_root);
7678
@override late final _TranslationsHomeDeleteFolderIt deleteFolder = _TranslationsHomeDeleteFolderIt._(_root);

lib/i18n/strings_it.i18n.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ home:
4747
renamedTo: La nota verrà rinominata in $newName
4848
multipleRenamedTo: "Le note seguenti verranno rinominate:"
4949
numberRenamedTo: $n le note verranno rinominate per evitare conflitti
50+
selectAllNotes: Seleziona tutto
51+
deselectAllNotes: Deseleziona tutto
5052
deleteNote: Elimina nota
5153
renameFolder:
5254
renameFolder: Rinomina cartella

lib/pages/home/recent_notes.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:saber/components/home/masonry_files.dart';
99
import 'package:saber/components/home/move_note_button.dart';
1010
import 'package:saber/components/home/new_note_button.dart';
1111
import 'package:saber/components/home/rename_note_button.dart';
12+
import 'package:saber/components/home/select_all_button.dart';
1213
import 'package:saber/components/home/syncing_button.dart';
1314
import 'package:saber/components/home/welcome.dart';
1415
import 'package:saber/data/file_manager/file_manager.dart';
@@ -203,6 +204,17 @@ class _RecentPageState extends State<RecentPage> {
203204
},
204205
icon: const Icon(Icons.delete_forever),
205206
),
207+
SelectAllNotesButton(
208+
selectedFiles: selectedFiles.value,
209+
allFiles: filePaths,
210+
selectAll: () => {
211+
selectedFiles.value.clear(),
212+
for (String file in filePaths)
213+
selectedFiles.value.add(file),
214+
setState(() {}),
215+
},
216+
deselectAll: () => selectedFiles.value = [],
217+
),
206218
ExportNoteButton(
207219
selectedFiles: selectedFiles.value,
208220
),

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ dependencies:
8787
defer_pointer: ^0.0.2
8888

8989
permission_handler: ^11.3.1
90-
saver_gallery: ^4.0.0
90+
saver_gallery: 3.0.5
9191

9292
animations: ^2.0.7
9393

0 commit comments

Comments
 (0)