mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-29 18:38:36 +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 isEmpty;
|
||||||
bool get hasNotes;
|
bool get hasNotes;
|
||||||
List<Note> get notes;
|
List<Note> get notes;
|
||||||
|
List<NotesFolder> get subFolders;
|
||||||
|
NotesFolderReadOnly get parent;
|
||||||
|
NotesFolder get fsFolder;
|
||||||
|
|
||||||
|
String pathSpec();
|
||||||
}
|
}
|
||||||
|
|
||||||
class NotesFolder
|
class NotesFolder
|
||||||
with NotesFolderNotifier
|
with NotesFolderNotifier
|
||||||
implements NotesFolderReadOnly, Comparable<NotesFolder> {
|
implements NotesFolderReadOnly, Comparable<NotesFolder> {
|
||||||
|
@override
|
||||||
final NotesFolder parent;
|
final NotesFolder parent;
|
||||||
String _folderPath;
|
String _folderPath;
|
||||||
|
|
||||||
@ -110,6 +116,7 @@ class NotesFolder
|
|||||||
return _notes;
|
return _notes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
List<NotesFolder> get subFolders {
|
List<NotesFolder> get subFolders {
|
||||||
// FIXME: This is really not ideal
|
// FIXME: This is really not ideal
|
||||||
_folders.sort();
|
_folders.sort();
|
||||||
@ -304,6 +311,7 @@ class NotesFolder
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
String pathSpec() {
|
String pathSpec() {
|
||||||
if (parent == null) {
|
if (parent == null) {
|
||||||
return "";
|
return "";
|
||||||
@ -328,4 +336,9 @@ class NotesFolder
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
NotesFolder get fsFolder {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ import 'notes_folder_notifier.dart';
|
|||||||
class SortedNotesFolder
|
class SortedNotesFolder
|
||||||
with NotesFolderNotifier
|
with NotesFolderNotifier
|
||||||
implements NotesFolderReadOnly {
|
implements NotesFolderReadOnly {
|
||||||
final NotesFolder folder;
|
final NotesFolderReadOnly folder;
|
||||||
|
|
||||||
SortingMode _sortingMode;
|
SortingMode _sortingMode;
|
||||||
NoteSortingFunction _sortFunc;
|
NoteSortingFunction _sortFunc;
|
||||||
@ -83,7 +83,7 @@ class SortedNotesFolder
|
|||||||
_notes.removeAt(i);
|
_notes.removeAt(i);
|
||||||
_insertInCorrectPos(note);
|
_insertInCorrectPos(note);
|
||||||
|
|
||||||
notifyListeners();
|
notifyNoteModified(-1, note);
|
||||||
}
|
}
|
||||||
|
|
||||||
int _insertInCorrectPos(Note note) {
|
int _insertInCorrectPos(Note note) {
|
||||||
@ -101,6 +101,9 @@ class SortedNotesFolder
|
|||||||
@override
|
@override
|
||||||
List<Note> get notes => _notes;
|
List<Note> get notes => _notes;
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<NotesFolder> get subFolders => folder.subFolders;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get hasNotes => folder.hasNotes;
|
bool get hasNotes => folder.hasNotes;
|
||||||
|
|
||||||
@ -117,4 +120,15 @@ class SortedNotesFolder
|
|||||||
}
|
}
|
||||||
|
|
||||||
SortingMode get sortingMode => _sortingMode;
|
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
|
@override
|
||||||
List<Note> get notes => _notes;
|
List<Note> get notes => _notes;
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<NotesFolder> get subFolders => [];
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get isEmpty => _notes.isEmpty;
|
bool get isEmpty => _notes.isEmpty;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get hasNotes => _notes.isNotEmpty;
|
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 {
|
class FolderView extends StatefulWidget {
|
||||||
final NotesFolder notesFolder;
|
final NotesFolderReadOnly notesFolder;
|
||||||
|
|
||||||
FolderView({@required this.notesFolder});
|
FolderView({@required this.notesFolder});
|
||||||
|
|
||||||
@ -173,7 +173,7 @@ class _FolderViewState extends State<FolderView> {
|
|||||||
|
|
||||||
void _newPost(BuildContext context) {
|
void _newPost(BuildContext context) {
|
||||||
var route = MaterialPageRoute(
|
var route = MaterialPageRoute(
|
||||||
builder: (context) => NoteEditor.newNote(widget.notesFolder));
|
builder: (context) => NoteEditor.newNote(widget.notesFolder.fsFolder));
|
||||||
Navigator.of(context).push(route);
|
Navigator.of(context).push(route);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,14 +1,36 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gitjournal/core/flattened_notes_folder.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'package:gitjournal/core/notes_folder.dart';
|
import 'package:gitjournal/core/notes_folder.dart';
|
||||||
|
|
||||||
import 'folder_view.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
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final notesFolder = Provider.of<NotesFolder>(context);
|
if (flattenedNotesFolder == null) {
|
||||||
return FolderView(notesFolder: notesFolder);
|
return Container();
|
||||||
|
}
|
||||||
|
|
||||||
|
return FolderView(notesFolder: flattenedNotesFolder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user