Add a JournalView and allow it to be switched

This commit is contained in:
Vishesh Handa
2020-03-05 18:47:12 +01:00
parent 846dda252e
commit 702c97c9dd
3 changed files with 148 additions and 1 deletions

View File

@ -2,6 +2,7 @@ import 'package:fimber/fimber.dart';
import 'package:flutter/material.dart';
import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/core/notes_folder.dart';
import 'package:gitjournal/folder_views/journal_view.dart';
import 'package:gitjournal/screens/note_editor.dart';
import 'package:gitjournal/utils.dart';
@ -33,12 +34,17 @@ Widget buildFolderView(
switch (viewType) {
case FolderViewType.Standard:
case FolderViewType.Journal:
return StandardView(
folder: folder,
noteSelectedFunction: noteSelectionFn,
emptyText: emptyText,
);
case FolderViewType.Journal:
return JournalView(
folder: folder,
noteSelectedFunction: noteSelectionFn,
emptyText: emptyText,
);
}
assert(false, "Code path should never be executed");

View File

@ -0,0 +1,99 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:gitjournal/folder_views/list_view.dart';
import 'package:intl/intl.dart';
import 'package:gitjournal/core/sorting_mode.dart';
import 'package:gitjournal/settings.dart';
import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/core/notes_folder.dart';
class JournalView extends StatelessWidget {
final NoteSelectedFunction noteSelectedFunction;
final NotesFolderReadOnly folder;
final String emptyText;
JournalView({
@required this.folder,
@required this.noteSelectedFunction,
@required this.emptyText,
});
@override
@override
Widget build(BuildContext context) {
return FolderListView(
folder: folder,
noteSelectedFunction: noteSelectedFunction,
emptyText: emptyText,
noteTileBuilder: _buildRow,
);
}
Widget _buildRow(BuildContext context, Note note) {
Widget titleWidget = Container();
var textTheme = Theme.of(context).textTheme;
DateTime date;
if (Settings.instance.sortingMode == SortingMode.Modified) {
date = note.modified;
} else if (Settings.instance.sortingMode == SortingMode.Created) {
date = note.created;
}
if (date != null) {
var formatter = DateFormat('dd MMM, yyyy ');
var dateStr = formatter.format(date);
var timeFormatter = DateFormat('Hm');
var time = timeFormatter.format(date);
var timeColor = textTheme.body1.color.withAlpha(100);
titleWidget = Row(
children: <Widget>[
Text(dateStr, style: textTheme.title),
Text(time, style: textTheme.body1.copyWith(color: timeColor)),
],
crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.alphabetic,
);
}
var children = <Widget>[
const SizedBox(height: 8.0),
Text(
note.summary,
maxLines: 3,
overflow: TextOverflow.ellipsis,
style: textTheme.body1,
),
];
var tile = ListTile(
isThreeLine: true,
title: titleWidget,
subtitle: Column(
children: children,
crossAxisAlignment: CrossAxisAlignment.start,
),
onTap: () => noteSelectedFunction(note),
);
var dc = Theme.of(context).dividerColor;
var divider = Container(
height: 1.0,
child: Divider(color: dc.withOpacity(dc.opacity / 3)),
);
return Column(
children: <Widget>[
divider,
Padding(
padding: const EdgeInsets.only(top: 16.0, bottom: 16.0),
child: tile,
),
divider,
],
);
}
}

View File

@ -70,6 +70,10 @@ class _FolderViewState extends State<FolderView> {
title: Text(title),
leading: GJAppBarMenuButton(),
actions: <Widget>[
IconButton(
icon: const Icon(Icons.library_books),
onPressed: _folderViewChooserSelected,
),
if (appState.remoteGitRepoConfigured) SyncButton(),
IconButton(
icon: Icon(Icons.search),
@ -154,4 +158,42 @@ class _FolderViewState extends State<FolderView> {
});
}
}
void _folderViewChooserSelected() async {
var onViewChange = (FolderViewType vt) => Navigator.of(context).pop(vt);
var newViewType = await showDialog<FolderViewType>(
context: context,
builder: (BuildContext context) {
var children = <Widget>[
RadioListTile<FolderViewType>(
title: const Text("Standard View"),
value: FolderViewType.Standard,
groupValue: _viewType,
onChanged: onViewChange,
),
RadioListTile<FolderViewType>(
title: const Text("Journal View"),
value: FolderViewType.Journal,
groupValue: _viewType,
onChanged: onViewChange,
),
];
return AlertDialog(
title: const Text("Select View"),
content: Column(
children: children,
mainAxisSize: MainAxisSize.min,
),
);
},
);
if (newViewType != null) {
setState(() {
_viewType = newViewType;
});
}
}
}