mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-29 18:38:36 +08:00
Add a JournalView and allow it to be switched
This commit is contained in:
@ -2,6 +2,7 @@ import 'package:fimber/fimber.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gitjournal/core/note.dart';
|
import 'package:gitjournal/core/note.dart';
|
||||||
import 'package:gitjournal/core/notes_folder.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/screens/note_editor.dart';
|
||||||
import 'package:gitjournal/utils.dart';
|
import 'package:gitjournal/utils.dart';
|
||||||
|
|
||||||
@ -33,12 +34,17 @@ Widget buildFolderView(
|
|||||||
|
|
||||||
switch (viewType) {
|
switch (viewType) {
|
||||||
case FolderViewType.Standard:
|
case FolderViewType.Standard:
|
||||||
case FolderViewType.Journal:
|
|
||||||
return StandardView(
|
return StandardView(
|
||||||
folder: folder,
|
folder: folder,
|
||||||
noteSelectedFunction: noteSelectionFn,
|
noteSelectedFunction: noteSelectionFn,
|
||||||
emptyText: emptyText,
|
emptyText: emptyText,
|
||||||
);
|
);
|
||||||
|
case FolderViewType.Journal:
|
||||||
|
return JournalView(
|
||||||
|
folder: folder,
|
||||||
|
noteSelectedFunction: noteSelectionFn,
|
||||||
|
emptyText: emptyText,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(false, "Code path should never be executed");
|
assert(false, "Code path should never be executed");
|
||||||
|
99
lib/folder_views/journal_view.dart
Normal file
99
lib/folder_views/journal_view.dart
Normal 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,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -70,6 +70,10 @@ class _FolderViewState extends State<FolderView> {
|
|||||||
title: Text(title),
|
title: Text(title),
|
||||||
leading: GJAppBarMenuButton(),
|
leading: GJAppBarMenuButton(),
|
||||||
actions: <Widget>[
|
actions: <Widget>[
|
||||||
|
IconButton(
|
||||||
|
icon: const Icon(Icons.library_books),
|
||||||
|
onPressed: _folderViewChooserSelected,
|
||||||
|
),
|
||||||
if (appState.remoteGitRepoConfigured) SyncButton(),
|
if (appState.remoteGitRepoConfigured) SyncButton(),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.search),
|
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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user