From a51f8f170f920ea58cd325a7045a8bc590198e3e Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Fri, 6 Dec 2019 01:22:57 +0100 Subject: [PATCH] Make Note and NotesFolder ChangeNotifiers This will allow us for finer grained notifications of when things change so we don't have to rebuild everything, like we do currently. --- lib/core/note.dart | 8 ++++- lib/core/notes_folder.dart | 51 +++++++++++++++++++------------ lib/widgets/folder_tree_view.dart | 5 ++- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/lib/core/note.dart b/lib/core/note.dart index 033db480..2ee4e26e 100644 --- a/lib/core/note.dart +++ b/lib/core/note.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:flutter/material.dart'; import 'package:gitjournal/storage/serializers.dart'; import 'package:gitjournal/utils/datetime.dart'; @@ -12,7 +13,7 @@ enum NoteLoadState { NotExists, } -class Note implements Comparable { +class Note with ChangeNotifier implements Comparable { NotesFolder parent; String filePath = ""; @@ -40,6 +41,7 @@ class Note implements Comparable { } else { _data.props.remove('created'); } + notifyListeners(); } String get body { @@ -48,6 +50,7 @@ class Note implements Comparable { set body(String newBody) { data.body = newBody; + notifyListeners(); } NoteData get data { @@ -77,6 +80,7 @@ class Note implements Comparable { } _created ??= DateTime(0, 0, 0, 0, 0, 0, 0, 0); + notifyListeners(); } bool hasValidDate() { @@ -103,6 +107,7 @@ class Note implements Comparable { if (!file.existsSync()) { _loadState = NoteLoadState.NotExists; + notifyListeners(); return _loadState; } @@ -112,6 +117,7 @@ class Note implements Comparable { _fileLastModified = file.lastModifiedSync(); _loadState = NoteLoadState.Loaded; + notifyListeners(); return _loadState; } diff --git a/lib/core/notes_folder.dart b/lib/core/notes_folder.dart index e8319805..a24d0585 100644 --- a/lib/core/notes_folder.dart +++ b/lib/core/notes_folder.dart @@ -1,20 +1,21 @@ import 'dart:io'; +import 'package:flutter/material.dart'; import 'package:path/path.dart' as p; import 'package:path/path.dart'; import 'note.dart'; import 'note_fs_entity.dart'; -class NotesFolder { +class NotesFolder with ChangeNotifier { NotesFolder parent; - List entities = []; + List _entities = []; String folderPath; NotesFolder(this.parent, this.folderPath); bool get isEmpty { - return entities.isEmpty; + return _entities.isEmpty; } String get name { @@ -22,16 +23,16 @@ class NotesFolder { } bool get hasSubFolders { - return entities.firstWhere((e) => e.isFolder, orElse: () => null) != null; + return _entities.firstWhere((e) => e.isFolder, orElse: () => null) != null; } bool get hasNotes { - return entities.firstWhere((e) => e.isNote, orElse: () => null) != null; + return _entities.firstWhere((e) => e.isNote, orElse: () => null) != null; } int get numberOfNotes { int i = 0; - entities.forEach((e) { + _entities.forEach((e) { if (e.isNote) i++; }); return i; @@ -41,7 +42,7 @@ class NotesFolder { List getAllNotes() { var notes = []; - for (var entity in entities) { + for (var entity in _entities) { if (entity.isNote) { notes.add(entity.note); } else { @@ -52,15 +53,19 @@ class NotesFolder { } List getNotes() { - return entities.where((e) => e.isNote).map((e) => e.note).toList(); + return _entities.where((e) => e.isNote).map((e) => e.note).toList(); } - // FIXME: This asynchronously loads everything. Maybe it should just list them, and the individual entities + List getFolders() { + return _entities.where((e) => e.isFolder).map((e) => e.folder).toList(); + } + + // FIXME: This asynchronously loads everything. Maybe it should just list them, and the individual _entities // should be loaded as required? // FIXME: This should not reconstruct the Notes or NotesFolders once constructed. Future loadRecursively() async { final dir = Directory(folderPath); - entities = []; + _entities = []; var lister = dir.list(recursive: false, followLinks: false); await for (var fsEntity in lister) { @@ -72,7 +77,7 @@ class NotesFolder { await subFolder.loadRecursively(); var noteFSEntity = NoteFSEntity(folder: subFolder); - entities.add(noteFSEntity); + _entities.add(noteFSEntity); } var note = Note(this, fsEntity.path); @@ -82,24 +87,29 @@ class NotesFolder { await note.load(); var noteFSEntity = NoteFSEntity(note: note); - entities.add(noteFSEntity); + _entities.add(noteFSEntity); } + + notifyListeners(); } void add(Note note) { assert(note.parent == this); - entities.add(NoteFSEntity(note: note)); + _entities.add(NoteFSEntity(note: note)); + + notifyListeners(); } void insert(int index, Note note) { assert(note.parent == this); - for (var i = 0; i < entities.length; i++) { - var e = entities[i]; + for (var i = 0; i < _entities.length; i++) { + var e = _entities[i]; if (e is NotesFolder) continue; if (index == 0) { - entities.insert(i, NoteFSEntity(note: note)); + _entities.insert(i, NoteFSEntity(note: note)); + notifyListeners(); return; } index--; @@ -108,13 +118,14 @@ class NotesFolder { void remove(Note note) { assert(note.parent == this); - var i = entities.indexWhere((e) { + var i = _entities.indexWhere((e) { if (e.isFolder) return false; return e.note.filePath == note.filePath; }); assert(i != -1); - entities.removeAt(i); + _entities.removeAt(i); + notifyListeners(); } void create() { @@ -129,6 +140,8 @@ class NotesFolder { void addFolder(NotesFolder folder) { assert(folder.parent == this); - entities.add(NoteFSEntity(folder: folder)); + _entities.add(NoteFSEntity(folder: folder)); + + notifyListeners(); } } diff --git a/lib/widgets/folder_tree_view.dart b/lib/widgets/folder_tree_view.dart index 60066ed3..fe00bd26 100644 --- a/lib/widgets/folder_tree_view.dart +++ b/lib/widgets/folder_tree_view.dart @@ -101,9 +101,8 @@ class FolderTileState extends State { if (!_isExpanded) return Container(); var children = []; - widget.folder.entities.forEach((entity) { - if (entity.isNote) return; - children.add(FolderTile(entity.folder, widget.onFolderSelected)); + widget.folder.getFolders().forEach((folder) { + children.add(FolderTile(folder, widget.onFolderSelected)); }); return Container(