Make the home screen show all the notes

It can show call the notes recursively, instead of showing just the root
folder. This makes it much easier to access a note recently modified.
This commit is contained in:
Vishesh Handa
2020-03-12 01:35:48 +01:00
parent 93269f339b
commit 494d866686
6 changed files with 175 additions and 7 deletions

View File

@ -0,0 +1,105 @@
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 {
final NotesFolder _parentFolder;
var _notes = <Note>[];
var _noteExtraInfo = <Note, int>{};
var _folders = <NotesFolderReadOnly>[];
FlattenedNotesFolder(this._parentFolder) {
_addFolder(_parentFolder);
}
void _addFolder(NotesFolderReadOnly folder) {
_folders.add(folder);
// Add Change notifiers
folder.addFolderAddedListener(_folderAdded);
folder.addFolderRemovedListener(_folderRemoved);
folder.addNoteAddedListener(_noteAdded);
folder.addNoteRemovedListener(_noteRemoved);
folder.addNoteModifiedListener(_noteModified);
// 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) {
folder.removeFolderAddedListener(_folderAdded);
folder.removeFolderRemovedListener(_folderRemoved);
folder.removeNoteAddedListener(_noteAdded);
folder.removeNoteRemovedListener(_noteRemoved);
folder.removeNoteModifiedListener(_noteModified);
}
void _noteAdded(int _, Note note) {
_notes.add(note);
_noteExtraInfo[note] = _notes.length - 1;
notifyNoteAdded(-1, note);
}
void _noteRemoved(int _, Note note) {
assert(_noteExtraInfo.containsKey(note));
var i = _noteExtraInfo[note];
_notes.removeAt(i);
notifyNoteRemoved(-1, note);
}
void _noteModified(int i, Note note) {
notifyNoteModified(-1, note);
}
@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
String pathSpec() => "";
@override
NotesFolder get fsFolder {
return _parentFolder;
}
}

View File

@ -11,11 +11,17 @@ abstract class NotesFolderReadOnly implements NotesFolderNotifier {
bool get isEmpty;
bool get hasNotes;
List<Note> get notes;
List<NotesFolder> get subFolders;
NotesFolderReadOnly get parent;
NotesFolder get fsFolder;
String pathSpec();
}
class NotesFolder
with NotesFolderNotifier
implements NotesFolderReadOnly, Comparable<NotesFolder> {
@override
final NotesFolder parent;
String _folderPath;
@ -110,6 +116,7 @@ class NotesFolder
return _notes;
}
@override
List<NotesFolder> get subFolders {
// FIXME: This is really not ideal
_folders.sort();
@ -304,6 +311,7 @@ class NotesFolder
notifyListeners();
}
@override
String pathSpec() {
if (parent == null) {
return "";
@ -328,4 +336,9 @@ class NotesFolder
}
}
}
@override
NotesFolder get fsFolder {
return this;
}
}

View File

@ -9,7 +9,7 @@ import 'notes_folder_notifier.dart';
class SortedNotesFolder
with NotesFolderNotifier
implements NotesFolderReadOnly {
final NotesFolder folder;
final NotesFolderReadOnly folder;
SortingMode _sortingMode;
NoteSortingFunction _sortFunc;
@ -83,7 +83,7 @@ class SortedNotesFolder
_notes.removeAt(i);
_insertInCorrectPos(note);
notifyListeners();
notifyNoteModified(-1, note);
}
int _insertInCorrectPos(Note note) {
@ -101,6 +101,9 @@ class SortedNotesFolder
@override
List<Note> get notes => _notes;
@override
List<NotesFolder> get subFolders => folder.subFolders;
@override
bool get hasNotes => folder.hasNotes;
@ -117,4 +120,15 @@ class SortedNotesFolder
}
SortingMode get sortingMode => _sortingMode;
@override
NotesFolder get parent => folder.parent;
@override
String pathSpec() => folder.pathSpec();
@override
NotesFolder get fsFolder {
return folder;
}
}

View File

@ -12,9 +12,23 @@ class VirtualNotesFolder
@override
List<Note> get notes => _notes;
@override
List<NotesFolder> get subFolders => [];
@override
bool get isEmpty => _notes.isEmpty;
@override
bool get hasNotes => _notes.isNotEmpty;
@override
NotesFolder get parent => null;
@override
String pathSpec() => "";
@override
NotesFolder get fsFolder {
return null;
}
}

View File

@ -23,7 +23,7 @@ enum DropDownChoices {
}
class FolderView extends StatefulWidget {
final NotesFolder notesFolder;
final NotesFolderReadOnly notesFolder;
FolderView({@required this.notesFolder});
@ -173,7 +173,7 @@ class _FolderViewState extends State<FolderView> {
void _newPost(BuildContext context) {
var route = MaterialPageRoute(
builder: (context) => NoteEditor.newNote(widget.notesFolder));
builder: (context) => NoteEditor.newNote(widget.notesFolder.fsFolder));
Navigator.of(context).push(route);
}

View File

@ -1,14 +1,36 @@
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 'folder_view.dart';
class HomeScreen extends StatelessWidget {
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
FlattenedNotesFolder flattenedNotesFolder;
@override
void initState() {
super.initState();
Future.delayed(Duration.zero, () {
final rootFolder = Provider.of<NotesFolder>(context);
setState(() {
flattenedNotesFolder = FlattenedNotesFolder(rootFolder);
});
});
}
@override
Widget build(BuildContext context) {
final notesFolder = Provider.of<NotesFolder>(context);
return FolderView(notesFolder: notesFolder);
if (flattenedNotesFolder == null) {
return Container();
}
return FolderView(notesFolder: flattenedNotesFolder);
}
}