Save and sort sheets by last access time

This commit is contained in:
2025-09-13 20:11:22 +02:00
parent a0d6368f02
commit 89aa15b8b8
7 changed files with 141 additions and 70 deletions

View File

@@ -1,6 +1,7 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:sheetless/storage_helper.dart';
class Sheet {
final String uuid;
@@ -28,9 +29,13 @@ class Sheet {
class SheetsWidget extends StatefulWidget {
final List<Sheet> sheets;
final ValueSetter<Sheet> callback;
final ValueSetter<Sheet> onSheetOpenRequest;
const SheetsWidget({super.key, required this.sheets, required this.callback});
const SheetsWidget({
super.key,
required this.sheets,
required this.onSheetOpenRequest,
});
@override
State<SheetsWidget> createState() => _SheetsWidgetState();
@@ -38,6 +43,7 @@ class SheetsWidget extends StatefulWidget {
class _SheetsWidgetState extends State<SheetsWidget> {
late List<Sheet> filteredSheets;
final StorageHelper storageHelper = StorageHelper();
final TextEditingController _searchController = TextEditingController();
Timer? _debounce;
@@ -69,16 +75,15 @@ class _SheetsWidgetState extends State<SheetsWidget> {
String query = _searchController.text.toLowerCase().trim();
List<String> terms = query.split(RegExp(r'\s+')); // Split by whitespace
filteredSheets =
widget.sheets.where((sheet) {
String name = sheet.name.toLowerCase();
String composer = sheet.composerName.toLowerCase();
filteredSheets = widget.sheets.where((sheet) {
String name = sheet.name.toLowerCase();
String composer = sheet.composerName.toLowerCase();
// Each term must be found in either the name or composer
return terms.every(
(term) => name.contains(term) || composer.contains(term),
);
}).toList();
// Each term must be found in either the name or composer
return terms.every(
(term) => name.contains(term) || composer.contains(term),
);
}).toList();
});
}
@@ -97,13 +102,12 @@ class _SheetsWidgetState extends State<SheetsWidget> {
decoration: InputDecoration(
hintText: 'Search...',
prefixIcon: const Icon(Icons.search),
suffixIcon:
_searchController.text.isNotEmpty
? IconButton(
icon: const Icon(Icons.clear),
onPressed: _clearSearch,
)
: null,
suffixIcon: _searchController.text.isNotEmpty
? IconButton(
icon: const Icon(Icons.clear),
onPressed: _clearSearch,
)
: null,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
),
@@ -118,7 +122,11 @@ class _SheetsWidgetState extends State<SheetsWidget> {
return ListTile(
title: Text(sheet.name),
subtitle: Text(sheet.composerName),
onTap: () => widget.callback(sheet),
onTap: () => setState(() {
widget.onSheetOpenRequest(sheet);
widget.sheets.remove(sheet);
widget.sheets.insert(0, sheet);
}),
);
},
),