From 7fd2546334827aa429c8d3bda864c6166ec78e66 Mon Sep 17 00:00:00 2001
From: Vishesh Handa <me@vhanda.in>
Date: Sun, 9 Feb 2020 19:11:01 +0100
Subject: [PATCH] Add as NotesFolderReadOnly interface

This simplifies the implementation of VirtualNotesFolder and
NotesFolder.
---
 lib/core/notes_folder.dart         | 13 +++++-
 lib/core/sorted_notes_folder.dart  | 68 ++----------------------------
 lib/core/virtual_notes_folder.dart | 66 ++---------------------------
 lib/screens/journal_listing.dart   |  4 +-
 lib/widgets/journal_list.dart      |  2 +-
 5 files changed, 22 insertions(+), 131 deletions(-)

diff --git a/lib/core/notes_folder.dart b/lib/core/notes_folder.dart
index 40013aa1..f699e46a 100644
--- a/lib/core/notes_folder.dart
+++ b/lib/core/notes_folder.dart
@@ -6,7 +6,15 @@ import 'package:path/path.dart';
 import 'note.dart';
 import 'notes_folder_notifier.dart';
 
-class NotesFolder with NotesFolderNotifier implements Comparable<NotesFolder> {
+abstract class NotesFolderReadOnly implements NotesFolderNotifier {
+  bool get isEmpty;
+  bool get hasNotes;
+  List<Note> get notes;
+}
+
+class NotesFolder
+    with NotesFolderNotifier
+    implements NotesFolderReadOnly, Comparable<NotesFolder> {
   final NotesFolder parent;
   String _folderPath;
 
@@ -31,6 +39,7 @@ class NotesFolder with NotesFolderNotifier implements Comparable<NotesFolder> {
 
   String get folderPath => _folderPath;
 
+  @override
   bool get isEmpty {
     return _notes.isEmpty && _folders.isEmpty;
   }
@@ -54,6 +63,7 @@ class NotesFolder with NotesFolderNotifier implements Comparable<NotesFolder> {
     return _folders.isNotEmpty;
   }
 
+  @override
   bool get hasNotes {
     return _notes.isNotEmpty;
   }
@@ -75,6 +85,7 @@ class NotesFolder with NotesFolderNotifier implements Comparable<NotesFolder> {
     return _notes.length;
   }
 
+  @override
   List<Note> get notes {
     return _notes;
   }
diff --git a/lib/core/sorted_notes_folder.dart b/lib/core/sorted_notes_folder.dart
index 4fb8b35a..370d69ff 100644
--- a/lib/core/sorted_notes_folder.dart
+++ b/lib/core/sorted_notes_folder.dart
@@ -2,7 +2,9 @@ import 'note.dart';
 import 'notes_folder.dart';
 import 'notes_folder_notifier.dart';
 
-class SortedNotesFolder with NotesFolderNotifier implements NotesFolder {
+class SortedNotesFolder
+    with NotesFolderNotifier
+    implements NotesFolderReadOnly {
   final NotesFolder folder;
 
   List<Note> _notes = [];
@@ -76,71 +78,9 @@ class SortedNotesFolder with NotesFolderNotifier implements NotesFolder {
   @override
   List<Note> get notes => _notes;
 
-  @override
-  List<NotesFolder> getFolders() => folder.getFolders();
-
-  //
-  // Dumb Interface Implementation
-  //
-  @override
-  NotesFolder get parent => folder.parent;
-
-  @override
-  String get folderPath => folder.folderPath;
-
-  @override
-  bool get isEmpty => folder.isEmpty;
-
-  @override
-  String get name => folder.name;
-
-  @override
-  String get fullName => folder.fullName;
-
-  @override
-  bool get hasSubFolders => folder.hasSubFolders;
-
   @override
   bool get hasNotes => folder.hasNotes;
 
   @override
-  bool get hasNotesRecursive => folder.hasNotesRecursive;
-
-  @override
-  int get numberOfNotes => folder.numberOfNotes;
-
-  @override
-  Future<void> loadRecursively() => folder.loadRecursively();
-
-  @override
-  Future<void> load() => folder.load();
-
-  @override
-  void add(Note note) => folder.add(note);
-
-  @override
-  void insert(int index, Note note) => folder.insert(index, note);
-
-  @override
-  void remove(Note note) => folder.remove(note);
-
-  @override
-  void create() => folder.create();
-
-  @override
-  void addFolder(NotesFolder folder) => folder.addFolder(folder);
-
-  @override
-  void removeFolder(NotesFolder folder) => folder.removeFolder(folder);
-
-  @override
-  void rename(String newName) => folder.rename(newName);
-
-  @override
-  String pathSpec() => folder.pathSpec();
-
-  @override
-  int compareTo(NotesFolder other) {
-    return folderPath.compareTo(other.folderPath);
-  }
+  bool get isEmpty => folder.isEmpty;
 }
diff --git a/lib/core/virtual_notes_folder.dart b/lib/core/virtual_notes_folder.dart
index 0d37d0ef..6459e11a 100644
--- a/lib/core/virtual_notes_folder.dart
+++ b/lib/core/virtual_notes_folder.dart
@@ -2,7 +2,9 @@ import 'note.dart';
 import 'notes_folder.dart';
 import 'notes_folder_notifier.dart';
 
-class VirtualNotesFolder with NotesFolderNotifier implements NotesFolder {
+class VirtualNotesFolder
+    with NotesFolderNotifier
+    implements NotesFolderReadOnly {
   final List<Note> _notes;
 
   VirtualNotesFolder(this._notes);
@@ -10,71 +12,9 @@ class VirtualNotesFolder with NotesFolderNotifier implements NotesFolder {
   @override
   List<Note> get notes => _notes;
 
-  @override
-  List<NotesFolder> getFolders() => [];
-
-  //
-  // Dumb Interface Implementation
-  //
-  @override
-  NotesFolder get parent => null;
-
-  @override
-  String get folderPath => "";
-
   @override
   bool get isEmpty => _notes.isEmpty;
 
-  @override
-  String get name => "";
-
-  @override
-  String get fullName => "";
-
-  @override
-  bool get hasSubFolders => false;
-
   @override
   bool get hasNotes => _notes.isNotEmpty;
-
-  @override
-  bool get hasNotesRecursive => hasNotes;
-
-  @override
-  int get numberOfNotes => _notes.length;
-
-  @override
-  Future<void> loadRecursively() async {}
-
-  @override
-  Future<void> load() async {}
-
-  @override
-  void add(Note note) {}
-
-  @override
-  void insert(int index, Note note) {}
-
-  @override
-  void remove(Note note) {}
-
-  @override
-  void create() {}
-
-  @override
-  void addFolder(NotesFolder folder) {}
-
-  @override
-  void removeFolder(NotesFolder folder) {}
-
-  @override
-  void rename(String newName) {}
-
-  @override
-  String pathSpec() => "";
-
-  @override
-  int compareTo(NotesFolder other) {
-    return folderPath.compareTo(other.folderPath);
-  }
 }
diff --git a/lib/screens/journal_listing.dart b/lib/screens/journal_listing.dart
index 9c383f01..e4613162 100644
--- a/lib/screens/journal_listing.dart
+++ b/lib/screens/journal_listing.dart
@@ -91,11 +91,11 @@ class _JournalListingScreenState extends State<JournalListingScreen> {
     Navigator.of(context).push(route);
   }
 
-  Widget buildJournalList(NotesFolder folder) {
+  Widget buildJournalList(NotesFolderReadOnly folder) {
     return Builder(
       builder: (context) {
         return JournalList(
-          folder: SortedNotesFolder(folder),
+          folder: folder,
           noteSelectedFunction: (Note note) async {
             var route = MaterialPageRoute(
               builder: (context) => NoteEditor.fromNote(note),
diff --git a/lib/widgets/journal_list.dart b/lib/widgets/journal_list.dart
index 84747352..1a4039a8 100644
--- a/lib/widgets/journal_list.dart
+++ b/lib/widgets/journal_list.dart
@@ -12,7 +12,7 @@ typedef void NoteSelectedFunction(Note note);
 
 class JournalList extends StatefulWidget {
   final NoteSelectedFunction noteSelectedFunction;
-  final NotesFolder folder;
+  final NotesFolderReadOnly folder;
   final String emptyText;
 
   JournalList({