Rename NotesFolder -> NotesFolderFS

And NotesFolderReadOnly to NotesFolder. It just makes more sense this
way as we're now getting more and more different "types" of
NotesFolders.
This commit is contained in:
Vishesh Handa
2020-03-15 01:53:01 +01:00
parent 893fa3f90f
commit b252f037b3
25 changed files with 418 additions and 410 deletions

View File

@ -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;

View File

@ -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 = <Note>[];
var _noteExtraInfo = <Note, int>{};
var _folders = <NotesFolderReadOnly>[];
var _folders = <NotesFolder>[];
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";
}

View File

@ -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<NoteRepoResult> addFolder(NotesFolder folder) async {
Future<NoteRepoResult> addFolder(NotesFolderFS folder) async {
await _gitRepo.add(".");
await _gitRepo.commit(
message: "Created New Folder",

View File

@ -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;

View File

@ -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<void> buildCache(
NotesFolder rootFolder,
NotesFolderFS rootFolder,
SortingMode sortingMode,
) async {
if (!enabled) return;

View File

@ -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<Note> get notes;
List<NotesFolder> get subFolders;
NotesFolderReadOnly get parent;
NotesFolder get parent;
NotesFolder get fsFolder;
String pathSpec();
}
class NotesFolder
with NotesFolderNotifier
implements NotesFolderReadOnly, Comparable<NotesFolder> {
@override
final NotesFolder parent;
String _folderPath;
List<Note> _notes = [];
List<NotesFolder> _folders = [];
Map<String, dynamic> _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<Note>.from(_notes);
notesCopy.forEach(remove);
var foldersCopy = List<NotesFolder>.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<Note> get notes {
return _notes;
}
@override
List<NotesFolder> 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<void> loadRecursively() async {
const maxParallel = 10;
var futures = <Future>[];
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 = <Future>[];
}
}
await Future.wait(futures);
futures = <Future>[];
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<void> load() async {
Set<String> 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<String> 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<Note> 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;
}
}

View File

@ -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<Note> _notes = [];
List<NotesFolderFS> _folders = [];
Map<String, dynamic> _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<Note>.from(_notes);
notesCopy.forEach(remove);
var foldersCopy = List<NotesFolder>.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<Note> get notes {
return _notes;
}
@override
List<NotesFolder> get subFolders => subFoldersFS;
List<NotesFolderFS> 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<void> loadRecursively() async {
const maxParallel = 10;
var futures = <Future>[];
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 = <Future>[];
}
}
await Future.wait(futures);
futures = <Future>[];
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<void> load() async {
Set<String> 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<String> 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<Note> 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;
}
}

View File

@ -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;

View File

@ -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<Note> _notes;
VirtualNotesFolder(this._notes);
@ -27,6 +25,9 @@ class VirtualNotesFolder
@override
String pathSpec() => "";
@override
String get name => "";
@override
NotesFolder get fsFolder {
return null;

View File

@ -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({

View File

@ -18,7 +18,7 @@ enum FolderViewType {
Widget buildFolderView(
BuildContext context,
FolderViewType viewType,
NotesFolderReadOnly folder,
NotesFolder folder,
String emptyText,
StandardViewHeader header,
bool showSummary,

View File

@ -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({

View File

@ -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({

View File

@ -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;

View File

@ -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<FolderListingScreen> {
final _folderTreeViewKey = GlobalKey<FolderTreeViewState>();
NotesFolder selectedFolder;
NotesFolderFS selectedFolder;
@override
Widget build(BuildContext context) {
final notesFolder = Provider.of<NotesFolder>(context);
final notesFolder = Provider.of<NotesFolderFS>(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<StateContainer>(context, listen: false);
final notesFolder = Provider.of<NotesFolder>(context);
final notesFolder = Provider.of<NotesFolderFS>(context);
container.createFolder(notesFolder, folderName);
}

View File

@ -23,7 +23,7 @@ enum DropDownChoices {
}
class FolderView extends StatefulWidget {
final NotesFolderReadOnly notesFolder;
final NotesFolder notesFolder;
FolderView({@required this.notesFolder});

View File

@ -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<HomeScreen> {
void initState() {
super.initState();
Future.delayed(Duration.zero, () {
final rootFolder = Provider.of<NotesFolder>(context);
final rootFolder = Provider.of<NotesFolderFS>(context);
setState(() {
flattenedNotesFolder = FlattenedNotesFolder(rootFolder);
});

View File

@ -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<SettingsList> {
subtitle: Text(Settings.instance.defaultNewNoteFolder
.replaceFirst('journal', 'Notes')),
onTap: () async {
var destFolder = await showDialog<NotesFolder>(
var destFolder = await showDialog<NotesFolderFS>(
context: context,
builder: (context) => FolderSelectionDialog(),
);

View File

@ -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;
}

View File

@ -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<NotesFolder>(context);
final notesFolder = Provider.of<NotesFolderFS>(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({

View File

@ -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<FolderTreeView> {
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<FolderTreeView> {
}
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,

View File

@ -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();

View File

@ -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();

View File

@ -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);

View File

@ -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);