mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-28 01:45:55 +08:00
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:
105
lib/core/flattened_notes_folder.dart
Normal file
105
lib/core/flattened_notes_folder.dart
Normal 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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user