diff --git a/lib/appstate.dart b/lib/appstate.dart index 3067cf7e..6f80994e 100644 --- a/lib/appstate.dart +++ b/lib/appstate.dart @@ -1,7 +1,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:fimber/fimber.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; enum SyncStatus { Unknown, @@ -35,7 +35,7 @@ class AppState { return notesFolder.hasNotes; } - NotesFolder notesFolder; + NotesFolderFS notesFolder; AppState(SharedPreferences pref) { localGitRepoConfigured = pref.getBool("localGitRepoConfigured") ?? false; diff --git a/lib/core/flattened_notes_folder.dart b/lib/core/flattened_notes_folder.dart index ec092498..9e60b89b 100644 --- a/lib/core/flattened_notes_folder.dart +++ b/lib/core/flattened_notes_folder.dart @@ -2,21 +2,19 @@ import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/notes_folder.dart'; import 'package:gitjournal/core/notes_folder_notifier.dart'; -class FlattenedNotesFolder - with NotesFolderNotifier - implements NotesFolderReadOnly { +class FlattenedNotesFolder with NotesFolderNotifier implements NotesFolder { final NotesFolder _parentFolder; var _notes = []; var _noteExtraInfo = {}; - var _folders = []; + var _folders = []; FlattenedNotesFolder(this._parentFolder) { _addFolder(_parentFolder); } - void _addFolder(NotesFolderReadOnly folder) { + void _addFolder(NotesFolder folder) { _folders.add(folder); // Add Change notifiers @@ -102,4 +100,7 @@ class FlattenedNotesFolder NotesFolder get fsFolder { return _parentFolder; } + + @override + String get name => "All Notes"; } diff --git a/lib/core/git_repo.dart b/lib/core/git_repo.dart index aa9c001b..adce3dc1 100644 --- a/lib/core/git_repo.dart +++ b/lib/core/git_repo.dart @@ -7,7 +7,7 @@ import 'package:fimber/fimber.dart'; import 'package:git_bindings/git_bindings.dart'; import 'package:gitjournal/core/note.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/settings.dart'; class NoteRepoResult { @@ -46,7 +46,7 @@ class GitNoteRepository { return NoteRepoResult(noteFilePath: note.filePath, error: false); } - Future addFolder(NotesFolder folder) async { + Future addFolder(NotesFolderFS folder) async { await _gitRepo.add("."); await _gitRepo.commit( message: "Created New Folder", diff --git a/lib/core/note.dart b/lib/core/note.dart index 04626ad3..753f0ab4 100644 --- a/lib/core/note.dart +++ b/lib/core/note.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:fimber/fimber.dart'; import 'package:gitjournal/core/md_yaml_doc_loader.dart'; import 'package:gitjournal/core/note_notifier.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/settings.dart'; import 'package:gitjournal/utils/markdown.dart'; import 'package:path/path.dart' as p; @@ -11,7 +12,6 @@ import 'md_yaml_doc.dart'; import 'md_yaml_doc_codec.dart'; import 'note_fileName.dart'; import 'note_serializer.dart'; -import 'notes_folder.dart'; enum NoteLoadState { None, @@ -21,7 +21,7 @@ enum NoteLoadState { } class Note with NotesNotifier { - NotesFolder parent; + NotesFolderFS parent; String _filePath; String _title = ""; @@ -204,7 +204,7 @@ class Note with NotesNotifier { _notifyModified(); } - bool move(NotesFolder destFolder) { + bool move(NotesFolderFS destFolder) { var destPath = p.join(destFolder.folderPath, fileName); if (File(destPath).existsSync()) { return false; diff --git a/lib/core/notes_cache.dart b/lib/core/notes_cache.dart index d7bbda06..b317c8a4 100644 --- a/lib/core/notes_cache.dart +++ b/lib/core/notes_cache.dart @@ -6,7 +6,7 @@ import 'package:path/path.dart' as p; import 'package:collection/collection.dart'; import 'package:gitjournal/core/note.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/core/sorting_mode.dart'; class NotesCache { @@ -16,7 +16,7 @@ class NotesCache { NotesCache({@required this.filePath, @required this.notesBasePath}); - Future load(NotesFolder rootFolder) async { + Future load(NotesFolderFS rootFolder) async { if (!enabled) return; var fileList = await loadFromDisk(); @@ -37,14 +37,14 @@ class NotesCache { var c = components.sublist(0, i + 1); var folderPath = p.join(this.notesBasePath, c.join(sep)); - var folders = parent.subFolders; + var folders = parent.subFoldersFS; var folderIndex = folders.indexWhere((f) => f.folderPath == folderPath); if (folderIndex != -1) { parent = folders[folderIndex]; continue; } - var subFolder = NotesFolder(parent, folderPath); + var subFolder = NotesFolderFS(parent, folderPath); parent.addFolder(subFolder); parent = subFolder; } @@ -56,7 +56,7 @@ class NotesCache { } Future buildCache( - NotesFolder rootFolder, + NotesFolderFS rootFolder, SortingMode sortingMode, ) async { if (!enabled) return; diff --git a/lib/core/notes_folder.dart b/lib/core/notes_folder.dart index e7c836a5..109a2978 100644 --- a/lib/core/notes_folder.dart +++ b/lib/core/notes_folder.dart @@ -1,344 +1,15 @@ -import 'dart:io'; - -import 'package:fimber/fimber.dart'; -import 'package:path/path.dart' as p; -import 'package:path/path.dart'; - import 'note.dart'; import 'notes_folder_notifier.dart'; -abstract class NotesFolderReadOnly implements NotesFolderNotifier { +abstract class NotesFolder implements NotesFolderNotifier { bool get isEmpty; bool get hasNotes; + String get name; + List get notes; List get subFolders; - NotesFolderReadOnly get parent; + NotesFolder get parent; NotesFolder get fsFolder; String pathSpec(); } - -class NotesFolder - with NotesFolderNotifier - implements NotesFolderReadOnly, Comparable { - @override - final NotesFolder parent; - String _folderPath; - - List _notes = []; - List _folders = []; - - Map _entityMap = {}; - - NotesFolder(this.parent, this._folderPath); - - @override - void dispose() { - _folders.forEach((f) => f.removeListener(_entityChanged)); - _notes.forEach((f) => f.removeListener(_entityChanged)); - - super.dispose(); - } - - void _entityChanged() { - notifyListeners(); - } - - void _noteModified(Note note) { - notifyNoteModified(-1, note); - } - - void reset(String folderPath) { - _folderPath = folderPath; - - var notesCopy = List.from(_notes); - notesCopy.forEach(remove); - - var foldersCopy = List.from(_folders); - foldersCopy.forEach(removeFolder); - - assert(_notes.isEmpty); - assert(_folders.isEmpty); - - notifyListeners(); - } - - String get folderPath => _folderPath; - - @override - bool get isEmpty { - return _notes.isEmpty && _folders.isEmpty; - } - - String get name { - return basename(folderPath); - } - - String get fullName { - String n = name; - var par = parent; - while (par != null) { - n = p.join(par.name, n); - par = par.parent; - } - - return n; - } - - bool get hasSubFolders { - return _folders.isNotEmpty; - } - - @override - bool get hasNotes { - return _notes.isNotEmpty; - } - - bool get hasNotesRecursive { - if (_notes.isNotEmpty) { - return true; - } - - for (var folder in _folders) { - if (folder.hasNotesRecursive) { - return true; - } - } - return false; - } - - int get numberOfNotes { - return _notes.length; - } - - @override - List get notes { - return _notes; - } - - @override - List get subFolders { - // FIXME: This is really not ideal - _folders.sort(); - return _folders; - } - - // FIXME: This asynchronously loads everything. Maybe it should just list them, and the individual _entities - // should be loaded as required? - Future loadRecursively() async { - const maxParallel = 10; - var futures = []; - - await load(); - - for (var note in _notes) { - // FIXME: Collected all the Errors, and report them back, along with "WHY", and the contents of the Note - // Each of these needs to be reported to crashlytics, as Note loading should never fail - var f = note.load(); - futures.add(f); - - if (futures.length >= maxParallel) { - await Future.wait(futures); - futures = []; - } - } - - await Future.wait(futures); - futures = []; - - for (var folder in _folders) { - var f = folder.loadRecursively(); - futures.add(f); - } - - return Future.wait(futures); - } - - // FIXME: This should not reconstruct the Notes or NotesFolders once constructed. - Future load() async { - Set pathsFound = {}; - - final dir = Directory(folderPath); - var lister = dir.list(recursive: false, followLinks: false); - await for (var fsEntity in lister) { - if (fsEntity is Link) { - continue; - } - - // If already seen before - var existingNoteFSEntity = _entityMap[fsEntity.path]; - if (existingNoteFSEntity != null) { - pathsFound.add(fsEntity.path); - continue; - } - - if (fsEntity is Directory) { - Fimber.d("Found directory ${fsEntity.path}"); - var subFolder = NotesFolder(this, fsEntity.path); - if (subFolder.name.startsWith('.')) { - continue; - } - subFolder.addListener(_entityChanged); - - _folders.add(subFolder); - _entityMap[fsEntity.path] = subFolder; - - pathsFound.add(fsEntity.path); - notifyFolderAdded(_folders.length - 1, subFolder); - continue; - } - - var note = Note(this, fsEntity.path); - if (!note.filePath.toLowerCase().endsWith('.md')) { - Fimber.d("Ignoring file ${fsEntity.path}"); - continue; - } - Fimber.d("Found file ${fsEntity.path}"); - note.addModifiedListener(_noteModified); - - _notes.add(note); - _entityMap[fsEntity.path] = note; - - pathsFound.add(fsEntity.path); - notifyNoteAdded(_notes.length - 1, note); - } - - Set pathsRemoved = _entityMap.keys.toSet().difference(pathsFound); - pathsRemoved.forEach((path) { - var e = _entityMap[path]; - assert(e != null); - - assert(e is NotesFolder || e is Note); - _entityMap.remove(path); - - if (e is Note) { - Fimber.d("File $path was no longer found"); - e.removeModifiedListener(_noteModified); - var i = _notes.indexWhere((n) => n.filePath == path); - assert(i != -1); - var note = _notes[i]; - _notes.removeAt(i); - notifyNoteRemoved(i, note); - } else { - Fimber.d("Folder $path was no longer found"); - e.removeListener(_entityChanged); - var i = _folders.indexWhere((f) => f.folderPath == path); - assert(i != -1); - var folder = _folders[i]; - _folders.removeAt(i); - notifyFolderRemoved(i, folder); - } - }); - } - - void add(Note note) { - assert(note.parent == this); - note.addModifiedListener(_noteModified); - - _notes.add(note); - _entityMap[note.filePath] = note; - - notifyNoteAdded(_notes.length - 1, note); - } - - void insert(int index, Note note) { - assert(note.parent == this); - assert(index >= 0); - note.addModifiedListener(_noteModified); - - _notes.insert(index, note); - _entityMap[note.filePath] = note; - - notifyNoteAdded(index, note); - } - - void remove(Note note) { - assert(note.parent == this); - note.removeModifiedListener(_noteModified); - - assert(_notes.indexWhere((n) => n.filePath == note.filePath) != -1); - assert(_entityMap.containsKey(note.filePath)); - - var index = _notes.indexWhere((n) => n.filePath == note.filePath); - assert(index != -1); - _notes.removeAt(index); - _entityMap.remove(note.filePath); - - notifyNoteRemoved(index, note); - } - - void create() { - // Git doesn't track Directories, only files, so we create an empty .gitignore file - // in the directory instead. - var gitIgnoreFilePath = p.join(folderPath, ".gitignore"); - var file = File(gitIgnoreFilePath); - if (!file.existsSync()) { - file.createSync(recursive: true); - } - notifyListeners(); - } - - void addFolder(NotesFolder folder) { - assert(folder.parent == this); - folder.addListener(_entityChanged); - - _folders.add(folder); - _entityMap[folder.folderPath] = folder; - - notifyFolderAdded(_folders.length - 1, folder); - } - - void removeFolder(NotesFolder folder) { - folder.removeListener(_entityChanged); - - assert(_folders.indexWhere((f) => f.folderPath == folder.folderPath) != -1); - assert(_entityMap.containsKey(folder.folderPath)); - - var index = _folders.indexWhere((f) => f.folderPath == folder.folderPath); - assert(index != -1); - _folders.removeAt(index); - _entityMap.remove(folder.folderPath); - - notifyFolderRemoved(index, folder); - } - - void rename(String newName) { - var dir = Directory(folderPath); - var parentDirName = dirname(folderPath); - dir.renameSync(folderPath); - _folderPath = p.join(parentDirName, newName); - - notifyListeners(); - } - - @override - String pathSpec() { - if (parent == null) { - return ""; - } - return p.join(parent.pathSpec(), name); - } - - @override - int compareTo(NotesFolder other) { - return folderPath.compareTo(other.folderPath); - } - - Iterable getAllNotes() sync* { - for (var note in _notes) { - yield note; - } - - for (var folder in _folders) { - var notes = folder.getAllNotes(); - for (var note in notes) { - yield note; - } - } - } - - @override - NotesFolder get fsFolder { - return this; - } -} diff --git a/lib/core/notes_folder_fs.dart b/lib/core/notes_folder_fs.dart new file mode 100644 index 00000000..2da8e328 --- /dev/null +++ b/lib/core/notes_folder_fs.dart @@ -0,0 +1,333 @@ +import 'dart:io'; + +import 'package:fimber/fimber.dart'; +import 'package:path/path.dart' as p; +import 'package:path/path.dart'; + +import 'note.dart'; +import 'notes_folder.dart'; +import 'notes_folder_notifier.dart'; + +class NotesFolderFS with NotesFolderNotifier implements NotesFolder { + final NotesFolderFS _parent; + String _folderPath; + + List _notes = []; + List _folders = []; + + Map _entityMap = {}; + + NotesFolderFS(this._parent, this._folderPath); + + @override + void dispose() { + _folders.forEach((f) => f.removeListener(_entityChanged)); + _notes.forEach((f) => f.removeListener(_entityChanged)); + + super.dispose(); + } + + @override + NotesFolder get parent => _parent; + + NotesFolderFS get parentFS => _parent; + + void _entityChanged() { + notifyListeners(); + } + + void _noteModified(Note note) { + notifyNoteModified(-1, note); + } + + void reset(String folderPath) { + _folderPath = folderPath; + + var notesCopy = List.from(_notes); + notesCopy.forEach(remove); + + var foldersCopy = List.from(_folders); + foldersCopy.forEach(removeFolder); + + assert(_notes.isEmpty); + assert(_folders.isEmpty); + + notifyListeners(); + } + + String get folderPath => _folderPath; + + @override + bool get isEmpty { + return _notes.isEmpty && _folders.isEmpty; + } + + @override + String get name => basename(folderPath); + + String get fullName { + String n = name; + var par = parent; + while (par != null) { + n = p.join(par.name, n); + par = par.parent; + } + + return n; + } + + bool get hasSubFolders { + return _folders.isNotEmpty; + } + + @override + bool get hasNotes { + return _notes.isNotEmpty; + } + + bool get hasNotesRecursive { + if (_notes.isNotEmpty) { + return true; + } + + for (var folder in _folders) { + if (folder.hasNotesRecursive) { + return true; + } + } + return false; + } + + int get numberOfNotes { + return _notes.length; + } + + @override + List get notes { + return _notes; + } + + @override + List get subFolders => subFoldersFS; + + List get subFoldersFS { + // FIXME: This is really not ideal + _folders.sort((NotesFolderFS a, NotesFolderFS b) => + a.folderPath.compareTo(b.folderPath)); + return _folders; + } + + // FIXME: This asynchronously loads everything. Maybe it should just list them, and the individual _entities + // should be loaded as required? + Future loadRecursively() async { + const maxParallel = 10; + var futures = []; + + await load(); + + for (var note in _notes) { + // FIXME: Collected all the Errors, and report them back, along with "WHY", and the contents of the Note + // Each of these needs to be reported to crashlytics, as Note loading should never fail + var f = note.load(); + futures.add(f); + + if (futures.length >= maxParallel) { + await Future.wait(futures); + futures = []; + } + } + + await Future.wait(futures); + futures = []; + + for (var folder in _folders) { + var f = folder.loadRecursively(); + futures.add(f); + } + + return Future.wait(futures); + } + + // FIXME: This should not reconstruct the Notes or NotesFolders once constructed. + Future load() async { + Set pathsFound = {}; + + final dir = Directory(folderPath); + var lister = dir.list(recursive: false, followLinks: false); + await for (var fsEntity in lister) { + if (fsEntity is Link) { + continue; + } + + // If already seen before + var existingNoteFSEntity = _entityMap[fsEntity.path]; + if (existingNoteFSEntity != null) { + pathsFound.add(fsEntity.path); + continue; + } + + if (fsEntity is Directory) { + Fimber.d("Found directory ${fsEntity.path}"); + var subFolder = NotesFolderFS(this, fsEntity.path); + if (subFolder.name.startsWith('.')) { + continue; + } + subFolder.addListener(_entityChanged); + + _folders.add(subFolder); + _entityMap[fsEntity.path] = subFolder; + + pathsFound.add(fsEntity.path); + notifyFolderAdded(_folders.length - 1, subFolder); + continue; + } + + var note = Note(this, fsEntity.path); + if (!note.filePath.toLowerCase().endsWith('.md')) { + Fimber.d("Ignoring file ${fsEntity.path}"); + continue; + } + Fimber.d("Found file ${fsEntity.path}"); + note.addModifiedListener(_noteModified); + + _notes.add(note); + _entityMap[fsEntity.path] = note; + + pathsFound.add(fsEntity.path); + notifyNoteAdded(_notes.length - 1, note); + } + + Set pathsRemoved = _entityMap.keys.toSet().difference(pathsFound); + pathsRemoved.forEach((path) { + var e = _entityMap[path]; + assert(e != null); + + assert(e is NotesFolder || e is Note); + _entityMap.remove(path); + + if (e is Note) { + Fimber.d("File $path was no longer found"); + e.removeModifiedListener(_noteModified); + var i = _notes.indexWhere((n) => n.filePath == path); + assert(i != -1); + var note = _notes[i]; + _notes.removeAt(i); + notifyNoteRemoved(i, note); + } else { + Fimber.d("Folder $path was no longer found"); + e.removeListener(_entityChanged); + var i = _folders.indexWhere((f) => f.folderPath == path); + assert(i != -1); + var folder = _folders[i]; + _folders.removeAt(i); + notifyFolderRemoved(i, folder); + } + }); + } + + void add(Note note) { + assert(note.parent == this); + note.addModifiedListener(_noteModified); + + _notes.add(note); + _entityMap[note.filePath] = note; + + notifyNoteAdded(_notes.length - 1, note); + } + + void insert(int index, Note note) { + assert(note.parent == this); + assert(index >= 0); + note.addModifiedListener(_noteModified); + + _notes.insert(index, note); + _entityMap[note.filePath] = note; + + notifyNoteAdded(index, note); + } + + void remove(Note note) { + assert(note.parent == this); + note.removeModifiedListener(_noteModified); + + assert(_notes.indexWhere((n) => n.filePath == note.filePath) != -1); + assert(_entityMap.containsKey(note.filePath)); + + var index = _notes.indexWhere((n) => n.filePath == note.filePath); + assert(index != -1); + _notes.removeAt(index); + _entityMap.remove(note.filePath); + + notifyNoteRemoved(index, note); + } + + void create() { + // Git doesn't track Directories, only files, so we create an empty .gitignore file + // in the directory instead. + var gitIgnoreFilePath = p.join(folderPath, ".gitignore"); + var file = File(gitIgnoreFilePath); + if (!file.existsSync()) { + file.createSync(recursive: true); + } + notifyListeners(); + } + + void addFolder(NotesFolderFS folder) { + assert(folder.parent == this); + folder.addListener(_entityChanged); + + _folders.add(folder); + _entityMap[folder.folderPath] = folder; + + notifyFolderAdded(_folders.length - 1, folder); + } + + void removeFolder(NotesFolderFS folder) { + folder.removeListener(_entityChanged); + + assert(_folders.indexWhere((f) => f.folderPath == folder.folderPath) != -1); + assert(_entityMap.containsKey(folder.folderPath)); + + var index = _folders.indexWhere((f) => f.folderPath == folder.folderPath); + assert(index != -1); + _folders.removeAt(index); + _entityMap.remove(folder.folderPath); + + notifyFolderRemoved(index, folder); + } + + void rename(String newName) { + var dir = Directory(folderPath); + var parentDirName = dirname(folderPath); + dir.renameSync(folderPath); + _folderPath = p.join(parentDirName, newName); + + notifyListeners(); + } + + @override + String pathSpec() { + if (parent == null) { + return ""; + } + return p.join(parent.pathSpec(), name); + } + + Iterable getAllNotes() sync* { + for (var note in _notes) { + yield note; + } + + for (var folder in _folders) { + var notes = folder.getAllNotes(); + for (var note in notes) { + yield note; + } + } + } + + @override + NotesFolder get fsFolder { + return this; + } +} diff --git a/lib/core/sorted_notes_folder.dart b/lib/core/sorted_notes_folder.dart index c37d7069..65bbcff7 100644 --- a/lib/core/sorted_notes_folder.dart +++ b/lib/core/sorted_notes_folder.dart @@ -6,10 +6,8 @@ import 'note.dart'; import 'notes_folder.dart'; import 'notes_folder_notifier.dart'; -class SortedNotesFolder - with NotesFolderNotifier - implements NotesFolderReadOnly { - final NotesFolderReadOnly folder; +class SortedNotesFolder with NotesFolderNotifier implements NotesFolder { + final NotesFolder folder; SortingMode _sortingMode; NoteSortingFunction _sortFunc; @@ -127,6 +125,9 @@ class SortedNotesFolder @override String pathSpec() => folder.pathSpec(); + @override + String get name => folder.name; + @override NotesFolder get fsFolder { return folder; diff --git a/lib/core/virtual_notes_folder.dart b/lib/core/virtual_notes_folder.dart index f997e45e..87272a6a 100644 --- a/lib/core/virtual_notes_folder.dart +++ b/lib/core/virtual_notes_folder.dart @@ -2,9 +2,7 @@ import 'note.dart'; import 'notes_folder.dart'; import 'notes_folder_notifier.dart'; -class VirtualNotesFolder - with NotesFolderNotifier - implements NotesFolderReadOnly { +class VirtualNotesFolder with NotesFolderNotifier implements NotesFolder { final List _notes; VirtualNotesFolder(this._notes); @@ -27,6 +25,9 @@ class VirtualNotesFolder @override String pathSpec() => ""; + @override + String get name => ""; + @override NotesFolder get fsFolder { return null; diff --git a/lib/folder_views/card_view.dart b/lib/folder_views/card_view.dart index 24bc28d1..0f590d3c 100644 --- a/lib/folder_views/card_view.dart +++ b/lib/folder_views/card_view.dart @@ -8,7 +8,7 @@ typedef void NoteSelectedFunction(Note note); class CardView extends StatelessWidget { final NoteSelectedFunction noteSelectedFunction; - final NotesFolderReadOnly folder; + final NotesFolder folder; final String emptyText; CardView({ diff --git a/lib/folder_views/common.dart b/lib/folder_views/common.dart index 27cc41fa..4df5a3f8 100644 --- a/lib/folder_views/common.dart +++ b/lib/folder_views/common.dart @@ -18,7 +18,7 @@ enum FolderViewType { Widget buildFolderView( BuildContext context, FolderViewType viewType, - NotesFolderReadOnly folder, + NotesFolder folder, String emptyText, StandardViewHeader header, bool showSummary, diff --git a/lib/folder_views/journal_view.dart b/lib/folder_views/journal_view.dart index 4577f3ce..f3f9f6df 100644 --- a/lib/folder_views/journal_view.dart +++ b/lib/folder_views/journal_view.dart @@ -11,7 +11,7 @@ import 'package:gitjournal/core/notes_folder.dart'; class JournalView extends StatelessWidget { final NoteSelectedFunction noteSelectedFunction; - final NotesFolderReadOnly folder; + final NotesFolder folder; final String emptyText; JournalView({ diff --git a/lib/folder_views/list_view.dart b/lib/folder_views/list_view.dart index b76c3f17..43261285 100644 --- a/lib/folder_views/list_view.dart +++ b/lib/folder_views/list_view.dart @@ -15,7 +15,7 @@ typedef Widget NoteTileBuilder(BuildContext context, Note note); class FolderListView extends StatefulWidget { final NoteTileBuilder noteTileBuilder; final NoteSelectedFunction noteSelectedFunction; - final NotesFolderReadOnly folder; + final NotesFolder folder; final String emptyText; FolderListView({ diff --git a/lib/folder_views/standard_view.dart b/lib/folder_views/standard_view.dart index 4b59c7e3..3091daf7 100644 --- a/lib/folder_views/standard_view.dart +++ b/lib/folder_views/standard_view.dart @@ -17,7 +17,7 @@ enum StandardViewHeader { class StandardView extends StatelessWidget { final NoteSelectedFunction noteSelectedFunction; - final NotesFolderReadOnly folder; + final NotesFolder folder; final String emptyText; final StandardViewHeader headerType; diff --git a/lib/screens/folder_listing.dart b/lib/screens/folder_listing.dart index eff6b3f1..936cd13e 100644 --- a/lib/screens/folder_listing.dart +++ b/lib/screens/folder_listing.dart @@ -6,7 +6,7 @@ import 'package:gitjournal/widgets/app_drawer.dart'; import 'package:gitjournal/widgets/folder_tree_view.dart'; import 'package:gitjournal/widgets/rename_dialog.dart'; import 'package:gitjournal/state_container.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'folder_view.dart'; @@ -17,16 +17,16 @@ class FolderListingScreen extends StatefulWidget { class _FolderListingScreenState extends State { final _folderTreeViewKey = GlobalKey(); - NotesFolder selectedFolder; + NotesFolderFS selectedFolder; @override Widget build(BuildContext context) { - final notesFolder = Provider.of(context); + final notesFolder = Provider.of(context); var treeView = FolderTreeView( key: _folderTreeViewKey, rootFolder: notesFolder, - onFolderEntered: (NotesFolder folder) { + onFolderEntered: (NotesFolderFS folder) { var route = MaterialPageRoute( builder: (context) => FolderView( notesFolder: folder, @@ -147,7 +147,7 @@ class CreateFolderButton extends StatelessWidget { ); if (folderName is String) { var container = Provider.of(context, listen: false); - final notesFolder = Provider.of(context); + final notesFolder = Provider.of(context); container.createFolder(notesFolder, folderName); } diff --git a/lib/screens/folder_view.dart b/lib/screens/folder_view.dart index 0686e8a2..e4d76410 100644 --- a/lib/screens/folder_view.dart +++ b/lib/screens/folder_view.dart @@ -23,7 +23,7 @@ enum DropDownChoices { } class FolderView extends StatefulWidget { - final NotesFolderReadOnly notesFolder; + final NotesFolder notesFolder; FolderView({@required this.notesFolder}); diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index 04262fe6..ac8d9bb1 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:gitjournal/core/flattened_notes_folder.dart'; import 'package:provider/provider.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'folder_view.dart'; @@ -18,7 +18,7 @@ class _HomeScreenState extends State { void initState() { super.initState(); Future.delayed(Duration.zero, () { - final rootFolder = Provider.of(context); + final rootFolder = Provider.of(context); setState(() { flattenedNotesFolder = FlattenedNotesFolder(rootFolder); }); diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index e10d6ebc..e2eca8a6 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/settings.dart'; import 'package:gitjournal/state_container.dart'; import 'package:gitjournal/utils.dart'; @@ -142,7 +142,7 @@ class SettingsListState extends State { subtitle: Text(Settings.instance.defaultNewNoteFolder .replaceFirst('journal', 'Notes')), onTap: () async { - var destFolder = await showDialog( + var destFolder = await showDialog( context: context, builder: (context) => FolderSelectionDialog(), ); diff --git a/lib/state_container.dart b/lib/state_container.dart index f0d7babc..35458381 100644 --- a/lib/state_container.dart +++ b/lib/state_container.dart @@ -8,7 +8,7 @@ import 'package:gitjournal/apis/git_migration.dart'; import 'package:gitjournal/appstate.dart'; import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/notes_cache.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/core/git_repo.dart'; import 'package:gitjournal/settings.dart'; import 'package:path/path.dart' as p; @@ -37,7 +37,7 @@ class StateContainer with ChangeNotifier { } _gitRepo = GitNoteRepository(gitDirPath: repoPath); - appState.notesFolder = NotesFolder(null, _gitRepo.gitDirPath); + appState.notesFolder = NotesFolderFS(null, _gitRepo.gitDirPath); // Just a fail safe if (!appState.remoteGitRepoConfigured) { @@ -117,9 +117,9 @@ class StateContainer with ChangeNotifier { return syncNotes(doNotThrow: true); } - void createFolder(NotesFolder parent, String folderName) async { + void createFolder(NotesFolderFS parent, String folderName) async { var newFolderPath = p.join(parent.folderPath, folderName); - var newFolder = NotesFolder(parent, newFolderPath); + var newFolder = NotesFolderFS(parent, newFolderPath); newFolder.create(); Fimber.d("Created New Folder: " + newFolderPath); @@ -130,16 +130,16 @@ class StateContainer with ChangeNotifier { }); } - void removeFolder(NotesFolder folder) { + void removeFolder(NotesFolderFS folder) { Fimber.d("Removing Folder: " + folder.folderPath); - folder.parent.removeFolder(folder); + folder.parentFS.removeFolder(folder); _gitRepo.removeFolder(folder.folderPath).then((NoteRepoResult _) { _syncNotes(); }); } - void renameFolder(NotesFolder folder, String newFolderName) { + void renameFolder(NotesFolderFS folder, String newFolderName) { var oldFolderPath = folder.folderPath; folder.rename(newFolderName); @@ -159,7 +159,7 @@ class StateContainer with ChangeNotifier { }); } - void moveNote(Note note, NotesFolder destFolder) { + void moveNote(Note note, NotesFolderFS destFolder) { if (destFolder.folderPath == note.parent.folderPath) { return; } diff --git a/lib/widgets/folder_selection_dialog.dart b/lib/widgets/folder_selection_dialog.dart index 7b019b07..82dc6031 100644 --- a/lib/widgets/folder_selection_dialog.dart +++ b/lib/widgets/folder_selection_dialog.dart @@ -1,19 +1,20 @@ import 'package:flutter/material.dart'; -import 'package:gitjournal/core/notes_folder.dart'; import 'package:provider/provider.dart'; -typedef NoteFolderCallback = void Function(NotesFolder); +import 'package:gitjournal/core/notes_folder_fs.dart'; + +typedef NoteFolderCallback = void Function(NotesFolderFS); class FolderSelectionDialog extends StatelessWidget { @override Widget build(BuildContext context) { - final notesFolder = Provider.of(context); + final notesFolder = Provider.of(context); var body = Container( width: double.maxFinite, child: FolderTreeView( rootFolder: notesFolder, - onFolderEntered: (NotesFolder destFolder) { + onFolderEntered: (NotesFolderFS destFolder) { Navigator.of(context).pop(destFolder); }, ), @@ -26,10 +27,10 @@ class FolderSelectionDialog extends StatelessWidget { } } -typedef void FolderSelectedCallback(NotesFolder folder); +typedef void FolderSelectedCallback(NotesFolderFS folder); class FolderTreeView extends StatelessWidget { - final NotesFolder rootFolder; + final NotesFolderFS rootFolder; final FolderSelectedCallback onFolderEntered; FolderTreeView({ @@ -52,7 +53,7 @@ class FolderTreeView extends StatelessWidget { } class FolderMiniTile extends StatefulWidget { - final NotesFolder folder; + final NotesFolderFS folder; final FolderSelectedCallback onTap; FolderMiniTile({ diff --git a/lib/widgets/folder_tree_view.dart b/lib/widgets/folder_tree_view.dart index 5c070f6c..61a63c1b 100644 --- a/lib/widgets/folder_tree_view.dart +++ b/lib/widgets/folder_tree_view.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; -typedef void FolderSelectedCallback(NotesFolder folder); +typedef void FolderSelectedCallback(NotesFolderFS folder); class FolderTreeView extends StatefulWidget { - final NotesFolder rootFolder; + final NotesFolderFS rootFolder; final FolderSelectedCallback onFolderSelected; final Function onFolderUnselected; @@ -22,18 +22,18 @@ class FolderTreeView extends StatefulWidget { @override FolderTreeViewState createState() => FolderTreeViewState(); - static void _doNothing(NotesFolder f) {} + static void _doNothing(NotesFolderFS f) {} } class FolderTreeViewState extends State { bool inSelectionMode = false; - NotesFolder selectedFolder; + NotesFolderFS selectedFolder; @override Widget build(BuildContext context) { var tile = FolderTile( folder: widget.rootFolder, - onTap: (NotesFolder folder) { + onTap: (NotesFolderFS folder) { if (!inSelectionMode) { widget.onFolderEntered(folder); } else { @@ -68,10 +68,10 @@ class FolderTreeViewState extends State { } class FolderTile extends StatefulWidget { - final NotesFolder folder; + final NotesFolderFS folder; final FolderSelectedCallback onTap; final FolderSelectedCallback onLongPress; - final NotesFolder selectedFolder; + final NotesFolderFS selectedFolder; FolderTile({ @required this.folder, diff --git a/test/checklist_test.dart b/test/checklist_test.dart index 001566ca..ed32fd9d 100644 --- a/test/checklist_test.dart +++ b/test/checklist_test.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:gitjournal/core/checklist.dart'; import 'package:gitjournal/core/note.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:path/path.dart' as p; import 'package:test/test.dart'; @@ -39,7 +39,7 @@ Booga Wooga var notePath = p.join(tempDir.path, "note.md"); File(notePath).writeAsString(content); - var parentFolder = NotesFolder(null, tempDir.path); + var parentFolder = NotesFolderFS(null, tempDir.path); var note = Note(parentFolder, notePath); await note.load(); @@ -114,7 +114,7 @@ Booga Wooga var notePath = p.join(tempDir.path, "note2.md"); await File(notePath).writeAsString(content); - var parentFolder = NotesFolder(null, tempDir.path); + var parentFolder = NotesFolderFS(null, tempDir.path); var note = Note(parentFolder, notePath); await note.load(); @@ -136,7 +136,7 @@ Booga Wooga var notePath = p.join(tempDir.path, "note3.md"); await File(notePath).writeAsString(content); - var parentFolder = NotesFolder(null, tempDir.path); + var parentFolder = NotesFolderFS(null, tempDir.path); var note = Note(parentFolder, notePath); await note.load(); @@ -156,7 +156,7 @@ Booga Wooga var notePath = p.join(tempDir.path, "note13.md"); await File(notePath).writeAsString(content); - var parentFolder = NotesFolder(null, tempDir.path); + var parentFolder = NotesFolderFS(null, tempDir.path); var note = Note(parentFolder, notePath); await note.load(); @@ -176,7 +176,7 @@ Booga Wooga var notePath = p.join(tempDir.path, "note4.md"); await File(notePath).writeAsString(content); - var parentFolder = NotesFolder(null, tempDir.path); + var parentFolder = NotesFolderFS(null, tempDir.path); var note = Note(parentFolder, notePath); await note.load(); @@ -196,7 +196,7 @@ Booga Wooga var notePath = p.join(tempDir.path, "note4.md"); await File(notePath).writeAsString(content); - var parentFolder = NotesFolder(null, tempDir.path); + var parentFolder = NotesFolderFS(null, tempDir.path); var note = Note(parentFolder, notePath); await note.load(); diff --git a/test/note_test.dart b/test/note_test.dart index 01578940..1d5330d8 100644 --- a/test/note_test.dart +++ b/test/note_test.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:gitjournal/core/note.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:path/path.dart' as p; import 'package:test/test.dart'; @@ -28,7 +28,7 @@ Hello"""; var notePath = p.join(tempDir.path, "note.md"); File(notePath).writeAsString(content); - var parentFolder = NotesFolder(null, tempDir.path); + var parentFolder = NotesFolderFS(null, tempDir.path); var note = Note(parentFolder, notePath); await note.load(); @@ -58,7 +58,7 @@ Hello"""; var notePath = p.join(tempDir.path, "note.md"); File(notePath).writeAsString(content); - var parentFolder = NotesFolder(null, tempDir.path); + var parentFolder = NotesFolderFS(null, tempDir.path); var note = Note(parentFolder, notePath); await note.load(); diff --git a/test/notes_cache_test.dart b/test/notes_cache_test.dart index ae510526..1fed9169 100644 --- a/test/notes_cache_test.dart +++ b/test/notes_cache_test.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:gitjournal/core/notes_cache.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:path/path.dart' as p; import 'package:test/test.dart'; @@ -39,7 +39,7 @@ void main() { test('Should create directory structure accurately', () async { await cache.saveToDisk(fileList); - var rootFolder = NotesFolder(null, '/base'); + var rootFolder = NotesFolderFS(null, '/base'); await cache.load(rootFolder); expect(rootFolder.subFolders.length, 2); diff --git a/test/sorting_mode_test.dart b/test/sorting_mode_test.dart index a6d418b4..59d872e2 100644 --- a/test/sorting_mode_test.dart +++ b/test/sorting_mode_test.dart @@ -1,12 +1,12 @@ import 'package:gitjournal/core/note.dart'; -import 'package:gitjournal/core/notes_folder.dart'; +import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/core/sorting_mode.dart'; import 'package:test/test.dart'; void main() { group('Sorting Mode', () { test('Created', () async { - var folder = NotesFolder(null, '/tmp/'); + var folder = NotesFolderFS(null, '/tmp/'); var n1 = Note(folder, '/tmp/1.md'); n1.created = DateTime(2020, 10, 01); @@ -30,7 +30,7 @@ void main() { }); test('Modified', () async { - var folder = NotesFolder(null, '/tmp/'); + var folder = NotesFolderFS(null, '/tmp/'); var n1 = Note(folder, '/tmp/1.md'); n1.modified = DateTime(2020, 10, 01);