mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-28 18:03:14 +08:00
Make Note and NotesFolder ChangeNotifiers
This will allow us for finer grained notifications of when things change so we don't have to rebuild everything, like we do currently.
This commit is contained in:
@ -1,5 +1,6 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gitjournal/storage/serializers.dart';
|
import 'package:gitjournal/storage/serializers.dart';
|
||||||
import 'package:gitjournal/utils/datetime.dart';
|
import 'package:gitjournal/utils/datetime.dart';
|
||||||
|
|
||||||
@ -12,7 +13,7 @@ enum NoteLoadState {
|
|||||||
NotExists,
|
NotExists,
|
||||||
}
|
}
|
||||||
|
|
||||||
class Note implements Comparable<Note> {
|
class Note with ChangeNotifier implements Comparable<Note> {
|
||||||
NotesFolder parent;
|
NotesFolder parent;
|
||||||
String filePath = "";
|
String filePath = "";
|
||||||
|
|
||||||
@ -40,6 +41,7 @@ class Note implements Comparable<Note> {
|
|||||||
} else {
|
} else {
|
||||||
_data.props.remove('created');
|
_data.props.remove('created');
|
||||||
}
|
}
|
||||||
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
String get body {
|
String get body {
|
||||||
@ -48,6 +50,7 @@ class Note implements Comparable<Note> {
|
|||||||
|
|
||||||
set body(String newBody) {
|
set body(String newBody) {
|
||||||
data.body = newBody;
|
data.body = newBody;
|
||||||
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
NoteData get data {
|
NoteData get data {
|
||||||
@ -77,6 +80,7 @@ class Note implements Comparable<Note> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_created ??= DateTime(0, 0, 0, 0, 0, 0, 0, 0);
|
_created ??= DateTime(0, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasValidDate() {
|
bool hasValidDate() {
|
||||||
@ -103,6 +107,7 @@ class Note implements Comparable<Note> {
|
|||||||
|
|
||||||
if (!file.existsSync()) {
|
if (!file.existsSync()) {
|
||||||
_loadState = NoteLoadState.NotExists;
|
_loadState = NoteLoadState.NotExists;
|
||||||
|
notifyListeners();
|
||||||
return _loadState;
|
return _loadState;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,6 +117,7 @@ class Note implements Comparable<Note> {
|
|||||||
_fileLastModified = file.lastModifiedSync();
|
_fileLastModified = file.lastModifiedSync();
|
||||||
_loadState = NoteLoadState.Loaded;
|
_loadState = NoteLoadState.Loaded;
|
||||||
|
|
||||||
|
notifyListeners();
|
||||||
return _loadState;
|
return _loadState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,21 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:path/path.dart' as p;
|
import 'package:path/path.dart' as p;
|
||||||
import 'package:path/path.dart';
|
import 'package:path/path.dart';
|
||||||
|
|
||||||
import 'note.dart';
|
import 'note.dart';
|
||||||
import 'note_fs_entity.dart';
|
import 'note_fs_entity.dart';
|
||||||
|
|
||||||
class NotesFolder {
|
class NotesFolder with ChangeNotifier {
|
||||||
NotesFolder parent;
|
NotesFolder parent;
|
||||||
List<NoteFSEntity> entities = [];
|
List<NoteFSEntity> _entities = [];
|
||||||
String folderPath;
|
String folderPath;
|
||||||
|
|
||||||
NotesFolder(this.parent, this.folderPath);
|
NotesFolder(this.parent, this.folderPath);
|
||||||
|
|
||||||
bool get isEmpty {
|
bool get isEmpty {
|
||||||
return entities.isEmpty;
|
return _entities.isEmpty;
|
||||||
}
|
}
|
||||||
|
|
||||||
String get name {
|
String get name {
|
||||||
@ -22,16 +23,16 @@ class NotesFolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool get hasSubFolders {
|
bool get hasSubFolders {
|
||||||
return entities.firstWhere((e) => e.isFolder, orElse: () => null) != null;
|
return _entities.firstWhere((e) => e.isFolder, orElse: () => null) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get hasNotes {
|
bool get hasNotes {
|
||||||
return entities.firstWhere((e) => e.isNote, orElse: () => null) != null;
|
return _entities.firstWhere((e) => e.isNote, orElse: () => null) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
int get numberOfNotes {
|
int get numberOfNotes {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
entities.forEach((e) {
|
_entities.forEach((e) {
|
||||||
if (e.isNote) i++;
|
if (e.isNote) i++;
|
||||||
});
|
});
|
||||||
return i;
|
return i;
|
||||||
@ -41,7 +42,7 @@ class NotesFolder {
|
|||||||
List<Note> getAllNotes() {
|
List<Note> getAllNotes() {
|
||||||
var notes = <Note>[];
|
var notes = <Note>[];
|
||||||
|
|
||||||
for (var entity in entities) {
|
for (var entity in _entities) {
|
||||||
if (entity.isNote) {
|
if (entity.isNote) {
|
||||||
notes.add(entity.note);
|
notes.add(entity.note);
|
||||||
} else {
|
} else {
|
||||||
@ -52,15 +53,19 @@ class NotesFolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<Note> getNotes() {
|
List<Note> getNotes() {
|
||||||
return entities.where((e) => e.isNote).map((e) => e.note).toList();
|
return _entities.where((e) => e.isNote).map((e) => e.note).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: This asynchronously loads everything. Maybe it should just list them, and the individual entities
|
List<NotesFolder> getFolders() {
|
||||||
|
return _entities.where((e) => e.isFolder).map((e) => e.folder).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: This asynchronously loads everything. Maybe it should just list them, and the individual _entities
|
||||||
// should be loaded as required?
|
// should be loaded as required?
|
||||||
// FIXME: This should not reconstruct the Notes or NotesFolders once constructed.
|
// FIXME: This should not reconstruct the Notes or NotesFolders once constructed.
|
||||||
Future<void> loadRecursively() async {
|
Future<void> loadRecursively() async {
|
||||||
final dir = Directory(folderPath);
|
final dir = Directory(folderPath);
|
||||||
entities = [];
|
_entities = [];
|
||||||
|
|
||||||
var lister = dir.list(recursive: false, followLinks: false);
|
var lister = dir.list(recursive: false, followLinks: false);
|
||||||
await for (var fsEntity in lister) {
|
await for (var fsEntity in lister) {
|
||||||
@ -72,7 +77,7 @@ class NotesFolder {
|
|||||||
await subFolder.loadRecursively();
|
await subFolder.loadRecursively();
|
||||||
|
|
||||||
var noteFSEntity = NoteFSEntity(folder: subFolder);
|
var noteFSEntity = NoteFSEntity(folder: subFolder);
|
||||||
entities.add(noteFSEntity);
|
_entities.add(noteFSEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
var note = Note(this, fsEntity.path);
|
var note = Note(this, fsEntity.path);
|
||||||
@ -82,24 +87,29 @@ class NotesFolder {
|
|||||||
await note.load();
|
await note.load();
|
||||||
|
|
||||||
var noteFSEntity = NoteFSEntity(note: note);
|
var noteFSEntity = NoteFSEntity(note: note);
|
||||||
entities.add(noteFSEntity);
|
_entities.add(noteFSEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
void add(Note note) {
|
void add(Note note) {
|
||||||
assert(note.parent == this);
|
assert(note.parent == this);
|
||||||
entities.add(NoteFSEntity(note: note));
|
_entities.add(NoteFSEntity(note: note));
|
||||||
|
|
||||||
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
void insert(int index, Note note) {
|
void insert(int index, Note note) {
|
||||||
assert(note.parent == this);
|
assert(note.parent == this);
|
||||||
|
|
||||||
for (var i = 0; i < entities.length; i++) {
|
for (var i = 0; i < _entities.length; i++) {
|
||||||
var e = entities[i];
|
var e = _entities[i];
|
||||||
if (e is NotesFolder) continue;
|
if (e is NotesFolder) continue;
|
||||||
|
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
entities.insert(i, NoteFSEntity(note: note));
|
_entities.insert(i, NoteFSEntity(note: note));
|
||||||
|
notifyListeners();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
index--;
|
index--;
|
||||||
@ -108,13 +118,14 @@ class NotesFolder {
|
|||||||
|
|
||||||
void remove(Note note) {
|
void remove(Note note) {
|
||||||
assert(note.parent == this);
|
assert(note.parent == this);
|
||||||
var i = entities.indexWhere((e) {
|
var i = _entities.indexWhere((e) {
|
||||||
if (e.isFolder) return false;
|
if (e.isFolder) return false;
|
||||||
return e.note.filePath == note.filePath;
|
return e.note.filePath == note.filePath;
|
||||||
});
|
});
|
||||||
assert(i != -1);
|
assert(i != -1);
|
||||||
|
|
||||||
entities.removeAt(i);
|
_entities.removeAt(i);
|
||||||
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
void create() {
|
void create() {
|
||||||
@ -129,6 +140,8 @@ class NotesFolder {
|
|||||||
|
|
||||||
void addFolder(NotesFolder folder) {
|
void addFolder(NotesFolder folder) {
|
||||||
assert(folder.parent == this);
|
assert(folder.parent == this);
|
||||||
entities.add(NoteFSEntity(folder: folder));
|
_entities.add(NoteFSEntity(folder: folder));
|
||||||
|
|
||||||
|
notifyListeners();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,9 +101,8 @@ class FolderTileState extends State<FolderTile> {
|
|||||||
if (!_isExpanded) return Container();
|
if (!_isExpanded) return Container();
|
||||||
|
|
||||||
var children = <FolderTile>[];
|
var children = <FolderTile>[];
|
||||||
widget.folder.entities.forEach((entity) {
|
widget.folder.getFolders().forEach((folder) {
|
||||||
if (entity.isNote) return;
|
children.add(FolderTile(folder, widget.onFolderSelected));
|
||||||
children.add(FolderTile(entity.folder, widget.onFolderSelected));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return Container(
|
return Container(
|
||||||
|
Reference in New Issue
Block a user