~cytrogen/fluent-reader-mobile

ref: 28b99e817dde641dec7cce333f69d2911758df23 fluent-reader-mobile/lib/models/groups_model.dart -rw-r--r-- 2.0 KiB
28b99e81 — Cytrogen feat: add subscription search/sort, rewrite README, upgrade infrastructure 4 hours ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import 'package:fluent_reader_lite/models/source.dart';
import 'package:fluent_reader_lite/utils/global.dart';
import 'package:fluent_reader_lite/utils/store.dart';
import 'package:flutter/cupertino.dart';

class GroupsModel with ChangeNotifier {
  Map<String, List<String>> _groups = Store.getGroups();
  List<String>? uncategorized = Store.getUncategorized();
  Map<String, int> _groupOpenTargets = Store.getGroupOpenTargets();

  Map<String, List<String>> get groups => _groups;
  set groups(Map<String, List<String>> groups) {
    _groups = groups;
    updateUncategorized();
    notifyListeners();
    Store.setGroups(groups);
  }

  void updateUncategorized({bool force = false}) {
    if (uncategorized != null || force) {
      final sids = Set<String>.from(
        Global.sourcesModel.getSources().map<String>((s) => s.id)
      );
      for (var group in _groups.values) {
        for (var sid in group) {
          sids.remove(sid);
        }
      }
      uncategorized = sids.toList();
      Store.setUncategorized(uncategorized);
    }
  }

  bool get showUncategorized => uncategorized != null;
  set showUncategorized(bool value) {
    if (showUncategorized != value) {
      if (value) {
        updateUncategorized(force: true);
      } else {
        uncategorized = null;
        Store.setUncategorized(null);
      }
      notifyListeners();
    }
  }

  SourceOpenTarget getGroupOpenTarget(String groupName) {
    var idx = _groupOpenTargets[groupName];
    if (idx == null || idx >= SourceOpenTarget.values.length) {
      return SourceOpenTarget.Inherit;
    }
    return SourceOpenTarget.values[idx];
  }

  void setGroupOpenTarget(String groupName, SourceOpenTarget target) {
    _groupOpenTargets[groupName] = target.index;
    Store.setGroupOpenTargets(_groupOpenTargets);
    notifyListeners();
  }

  String? findGroupForSource(String sourceId) {
    for (var entry in _groups.entries) {
      if (entry.value.contains(sourceId)) {
        return entry.key;
      }
    }
    return null;
  }
}