Add ability to toggle filters on/off

This commit is contained in:
Hank Grabowski 2023-05-08 09:32:00 -04:00
parent 1474bbc69a
commit 55052b0852
4 changed files with 33 additions and 1 deletions

View file

@ -38,6 +38,7 @@ class TimelineEntryFilter {
final String id;
final TimelineEntryFilterAction action;
final String name;
final bool enabled;
final List<StringFilter> authorFilters;
final List<StringFilter> domainFilters;
final List<StringFilter> keywordFilters;
@ -47,16 +48,39 @@ class TimelineEntryFilter {
required this.id,
required this.action,
required this.name,
required this.enabled,
required this.authorFilters,
required this.domainFilters,
required this.keywordFilters,
required this.hashtagFilters,
});
TimelineEntryFilter copy({
String? id,
TimelineEntryFilterAction? action,
String? name,
bool? enabled,
List<StringFilter>? authorFilters,
List<StringFilter>? domainFilters,
List<StringFilter>? keywordFilters,
List<StringFilter>? hashtagFilters,
}) =>
TimelineEntryFilter(
id: id ?? this.id,
action: action ?? this.action,
name: name ?? this.name,
enabled: enabled ?? this.enabled,
authorFilters: authorFilters ?? this.authorFilters,
domainFilters: domainFilters ?? this.domainFilters,
keywordFilters: keywordFilters ?? this.keywordFilters,
hashtagFilters: hashtagFilters ?? this.hashtagFilters,
);
factory TimelineEntryFilter.create({
String? id,
required TimelineEntryFilterAction action,
required String name,
required bool enabled,
List<Connection> authors = const [],
List<String> domains = const [],
List<String> keywords = const [],
@ -66,6 +90,7 @@ class TimelineEntryFilter {
id: id ?? const Uuid().v4(),
action: action,
name: name,
enabled: enabled,
authorFilters: authors
.map((a) =>
StringFilter(filterString: a.id, type: ComparisonType.equals))
@ -106,6 +131,7 @@ class TimelineEntryFilter {
'id': id,
'action': action.name,
'name': name,
'enabled': enabled,
'authorFilters': authorFilters.map((f) => f.toJson()).toList(),
'domainFilters': domainFilters.map((f) => f.toJson()).toList(),
'keywordFilters': keywordFilters.map((f) => f.toJson()).toList(),
@ -117,6 +143,7 @@ class TimelineEntryFilter {
id: json['id'],
action: TimelineEntryFilterAction.parse(json['action']),
name: json['name'],
enabled: json['enabled'] ?? true,
authorFilters: (json['authorFilters'] as List<dynamic>)
.map((json) => StringFilter.fromJson(json))
.toList(),

View file

@ -335,6 +335,7 @@ class _FilterEditorScreenState extends State<FilterEditorScreen> {
id: widget.id.isNotEmpty ? widget.id : null,
action: action,
name: nameController.text,
enabled: true,
authors: filteredAuthors,
hashtags: filteredHashtags,
keywords: filteredKeywords,

View file

@ -52,6 +52,10 @@ class FiltersScreen extends StatelessWidget {
Widget buildFilterSummary(BuildContext context, TimelineEntryFilter filter,
TimelineEntryFilterService service) {
return ListTile(
leading: Checkbox(
onChanged: (value) => service.upsertFilter(filter.copy(enabled: value)),
value: filter.enabled,
),
title: Text('${filter.action.toVerb()} Filter: ${filter.name}'),
subtitle: Text(
filter.toSummaryText(),

View file

@ -45,7 +45,7 @@ FilterResult runFilters(
var isFiltered = false;
var action = TimelineEntryFilterAction.warn;
var trippingFilterName = '';
for (final filter in filters) {
for (final filter in filters.where((f) => f.enabled)) {
if (filter.isFiltered(entry)) {
isFiltered = true;
if (trippingFilterName.isEmpty) {