mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-08-26 10:38:13 +08:00

Fixes #78 This is probably the largest commit that I have ever made. From now on - every File always has an mtime and ctime which is fetched from git. Notes can optionally override that time by providing yaml metadata. Additionally the 'filePath' and 'folderPath' is now relative to the repoPath instead of being the full path. This will slow down GitJournal like crazy as all the mtimes and ctime still need to be cached. For my test repo it takes about 23 seconds for GitJournal to become responsive.
128 lines
2.9 KiB
Dart
128 lines
2.9 KiB
Dart
/*
|
|
* SPDX-FileCopyrightText: 2019-2021 Vishesh Handa <me@vhanda.in>
|
|
*
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
import 'package:gitjournal/core/folder/notes_folder.dart';
|
|
import 'package:gitjournal/core/folder/notes_folder_notifier.dart';
|
|
import 'package:gitjournal/core/note.dart';
|
|
|
|
typedef NotesFilter = Future<bool> Function(Note note);
|
|
|
|
class FlattenedNotesFolder with NotesFolderNotifier implements NotesFolder {
|
|
final NotesFolder _parentFolder;
|
|
final String title;
|
|
|
|
final _notes = <Note>[];
|
|
final _folders = <NotesFolder>[];
|
|
|
|
FlattenedNotesFolder(this._parentFolder, {required this.title}) {
|
|
_addFolder(_parentFolder);
|
|
}
|
|
|
|
void _addFolder(NotesFolder folder) {
|
|
_folders.add(folder);
|
|
|
|
// Add Change notifiers
|
|
folder.addFolderAddedListener(_folderAdded);
|
|
folder.addFolderRemovedListener(_folderRemoved);
|
|
|
|
folder.addNoteAddedListener(_noteAdded);
|
|
folder.addNoteRemovedListener(_noteRemoved);
|
|
folder.addNoteModifiedListener(_noteModified);
|
|
folder.addNoteRenameListener(_noteRenamed);
|
|
|
|
// Add Individual Notes
|
|
for (var note in folder.notes) {
|
|
_noteAdded(-1, note);
|
|
}
|
|
|
|
// Add Sub-Folders
|
|
for (var folder in folder.subFolders) {
|
|
_addFolder(folder);
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
for (var folder in _folders) {
|
|
_folderRemoved(-1, folder);
|
|
}
|
|
|
|
super.dispose();
|
|
}
|
|
|
|
void _folderAdded(int _, NotesFolder folder) {
|
|
_addFolder(folder);
|
|
}
|
|
|
|
void _folderRemoved(int _, NotesFolder folder) {
|
|
//
|
|
// FIXME: Wouldn't all the notes from this folder also need to be removed?
|
|
//
|
|
folder.removeFolderAddedListener(_folderAdded);
|
|
folder.removeFolderRemovedListener(_folderRemoved);
|
|
|
|
folder.removeNoteAddedListener(_noteAdded);
|
|
folder.removeNoteRemovedListener(_noteRemoved);
|
|
folder.removeNoteModifiedListener(_noteModified);
|
|
folder.removeNoteRenameListener(_noteRenamed);
|
|
}
|
|
|
|
void _noteAdded(int _, Note note) {
|
|
_notes.add(note);
|
|
notifyNoteAdded(_notes.length - 1, note);
|
|
}
|
|
|
|
void _noteRemoved(int _, Note note) {
|
|
var i = _notes.indexWhere((n) => n.filePath == note.filePath);
|
|
if (i == -1) {
|
|
return;
|
|
}
|
|
assert(i != -1);
|
|
|
|
var _ = _notes.removeAt(i);
|
|
notifyNoteRemoved(i, note);
|
|
}
|
|
|
|
Future<void> _noteModified(int _, Note note) async {
|
|
notifyNoteModified(-1, note);
|
|
}
|
|
|
|
void _noteRenamed(int _, Note note, String oldPath) {
|
|
notifyNoteRenamed(-1, note, oldPath);
|
|
}
|
|
|
|
@override
|
|
List<Note> get notes => _notes;
|
|
|
|
@override
|
|
List<NotesFolder> get subFolders => [];
|
|
|
|
@override
|
|
bool get hasNotes => _notes.isNotEmpty;
|
|
|
|
@override
|
|
bool get isEmpty => _notes.isEmpty;
|
|
|
|
@override
|
|
NotesFolder? get parent => null;
|
|
|
|
@override
|
|
NotesFolder get fsFolder {
|
|
return _parentFolder;
|
|
}
|
|
|
|
@override
|
|
String get name => title;
|
|
|
|
@override
|
|
String get publicName => title;
|
|
|
|
@override
|
|
NotesFolderConfig get config {
|
|
return _parentFolder.config;
|
|
}
|
|
}
|