mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-07-15 07:56:11 +08:00
Move NoteBacklinks Widget to its own file
This commit is contained in:
@ -7,6 +7,7 @@ import 'package:flutter_markdown/flutter_markdown.dart';
|
|||||||
import 'package:gitjournal/folder_views/common.dart';
|
import 'package:gitjournal/folder_views/common.dart';
|
||||||
import 'package:gitjournal/utils.dart';
|
import 'package:gitjournal/utils.dart';
|
||||||
import 'package:gitjournal/widgets/editor_scroll_view.dart';
|
import 'package:gitjournal/widgets/editor_scroll_view.dart';
|
||||||
|
import 'package:gitjournal/widgets/notes_backlinks.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
import 'package:path/path.dart' as p;
|
import 'package:path/path.dart' as p;
|
||||||
@ -182,86 +183,3 @@ Widget _handleDataSchemeUri(Uri uri, final double width, final double height) {
|
|||||||
}
|
}
|
||||||
return const SizedBox();
|
return const SizedBox();
|
||||||
}
|
}
|
||||||
|
|
||||||
class NoteBacklinkRenderer extends StatefulWidget {
|
|
||||||
final Note note;
|
|
||||||
final NotesFolderFS rootFolder;
|
|
||||||
|
|
||||||
NoteBacklinkRenderer({
|
|
||||||
@required this.note,
|
|
||||||
@required this.rootFolder,
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
|
||||||
_NoteBacklinkRendererState createState() => _NoteBacklinkRendererState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _NoteBacklinkRendererState extends State<NoteBacklinkRenderer> {
|
|
||||||
List<Note> linkedNotes = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
|
|
||||||
_initStateAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _initStateAsync() async {
|
|
||||||
var predicate = (Note n) async {
|
|
||||||
var links = await n.fetchLinks();
|
|
||||||
var matchedLink = links.firstWhere(
|
|
||||||
(l) => l.filePath == widget.note.filePath,
|
|
||||||
orElse: () => null,
|
|
||||||
);
|
|
||||||
return matchedLink != null;
|
|
||||||
};
|
|
||||||
|
|
||||||
var l = await widget.rootFolder.matchNotes(predicate);
|
|
||||||
if (!mounted) return;
|
|
||||||
setState(() {
|
|
||||||
linkedNotes = l;
|
|
||||||
print("linkedNote $linkedNotes");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
if (linkedNotes.isEmpty) {
|
|
||||||
return Container();
|
|
||||||
}
|
|
||||||
|
|
||||||
var textTheme = Theme.of(context).textTheme;
|
|
||||||
var c = Column(
|
|
||||||
children: <Widget>[
|
|
||||||
Text('BackLinks', style: textTheme.headline5),
|
|
||||||
const SizedBox(height: 8.0),
|
|
||||||
for (var n in linkedNotes) _buildNoteLink(n),
|
|
||||||
],
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
);
|
|
||||||
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.fromLTRB(0.0, 16.0, 0.0, 16.0),
|
|
||||||
child: c,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildNoteLink(Note note) {
|
|
||||||
var textTheme = Theme.of(context).textTheme;
|
|
||||||
var title = note.title;
|
|
||||||
if (title.isEmpty) {
|
|
||||||
title = note.fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.fromLTRB(0.0, 8.0, 0, 8.0),
|
|
||||||
child: GestureDetector(
|
|
||||||
onTap: () {
|
|
||||||
openNoteEditor(context, note);
|
|
||||||
},
|
|
||||||
child: Text('- $title', style: textTheme.bodyText1),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
99
lib/widgets/notes_backlinks.dart
Normal file
99
lib/widgets/notes_backlinks.dart
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gitjournal/folder_views/common.dart';
|
||||||
|
|
||||||
|
import 'package:gitjournal/core/note.dart';
|
||||||
|
import 'package:gitjournal/core/notes_folder_fs.dart';
|
||||||
|
|
||||||
|
class NoteBacklinkRenderer extends StatefulWidget {
|
||||||
|
final Note note;
|
||||||
|
final NotesFolderFS rootFolder;
|
||||||
|
|
||||||
|
NoteBacklinkRenderer({
|
||||||
|
@required this.note,
|
||||||
|
@required this.rootFolder,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_NoteBacklinkRendererState createState() => _NoteBacklinkRendererState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _NoteBacklinkRendererState extends State<NoteBacklinkRenderer> {
|
||||||
|
List<Note> linkedNotes = [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
|
||||||
|
_initStateAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _initStateAsync() async {
|
||||||
|
var predicate = (Note n) async {
|
||||||
|
var links = await n.fetchLinks();
|
||||||
|
var matchedLink = links.firstWhere(
|
||||||
|
(l) => l.filePath == widget.note.filePath,
|
||||||
|
orElse: () => null,
|
||||||
|
);
|
||||||
|
return matchedLink != null;
|
||||||
|
};
|
||||||
|
|
||||||
|
var l = await widget.rootFolder.matchNotes(predicate);
|
||||||
|
if (!mounted) return;
|
||||||
|
setState(() {
|
||||||
|
linkedNotes = l;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
if (linkedNotes.isEmpty) {
|
||||||
|
return Container();
|
||||||
|
}
|
||||||
|
|
||||||
|
var textTheme = Theme.of(context).textTheme;
|
||||||
|
var c = Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Text('BackLinks', style: textTheme.headline5),
|
||||||
|
const SizedBox(height: 8.0),
|
||||||
|
for (var n in linkedNotes)
|
||||||
|
NoteSnippet(n, () {
|
||||||
|
openNoteEditor(context, n);
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
);
|
||||||
|
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.fromLTRB(0.0, 16.0, 0.0, 16.0),
|
||||||
|
child: c,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NoteSnippet extends StatelessWidget {
|
||||||
|
final Note note;
|
||||||
|
final Function onTap;
|
||||||
|
|
||||||
|
NoteSnippet(this.note, this.onTap);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
var textTheme = Theme.of(context).textTheme;
|
||||||
|
var title = note.title;
|
||||||
|
if (title.isEmpty) {
|
||||||
|
title = note.fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.fromLTRB(0.0, 8.0, 0, 8.0),
|
||||||
|
child: GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
openNoteEditor(context, note);
|
||||||
|
},
|
||||||
|
child: Text('- $title', style: textTheme.bodyText1),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user