FolderView: Implement selecting a note

This is disabled for now, untill I expose the actions which should be
performed when selecting a note.
This commit is contained in:
Vishesh Handa
2020-09-05 15:53:26 +02:00
parent 8201e59014
commit fa075c25e0
10 changed files with 51 additions and 13 deletions

View File

@ -19,6 +19,9 @@ import 'md_yaml_doc.dart';
import 'md_yaml_doc_codec.dart'; import 'md_yaml_doc_codec.dart';
import 'note_serializer.dart'; import 'note_serializer.dart';
typedef void NoteSelectedFunction(Note note);
typedef bool NoteBoolPropertyFunction(Note note);
enum NoteLoadState { enum NoteLoadState {
None, None,
Loading, Loading,

View File

@ -3,12 +3,15 @@ import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.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/note_tile.dart'; import 'package:gitjournal/folder_views/note_tile.dart';
class CardView extends StatelessWidget { class CardView extends StatelessWidget {
final NoteSelectedFunction noteTapped; final NoteSelectedFunction noteTapped;
final NoteSelectedFunction noteLongPressed; final NoteSelectedFunction noteLongPressed;
final NoteBoolPropertyFunction isNoteSelected;
final NotesFolder folder; final NotesFolder folder;
final String emptyText; final String emptyText;
final bool fixedHeight; final bool fixedHeight;
@ -17,6 +20,7 @@ class CardView extends StatelessWidget {
@required this.folder, @required this.folder,
@required this.noteTapped, @required this.noteTapped,
@required this.noteLongPressed, @required this.noteLongPressed,
@required this.isNoteSelected,
@required this.emptyText, @required this.emptyText,
this.fixedHeight = false, this.fixedHeight = false,
}); });
@ -52,6 +56,7 @@ class CardView extends StatelessWidget {
note: note, note: note,
noteTapped: noteTapped, noteTapped: noteTapped,
noteLongPressed: noteLongPressed, noteLongPressed: noteLongPressed,
selected: isNoteSelected(note),
); );
}, },
maxCrossAxisExtent: 200.0, maxCrossAxisExtent: 200.0,

View File

@ -20,8 +20,6 @@ enum FolderViewType {
Grid, Grid,
} }
typedef void NoteSelectedFunction(Note note);
Widget buildFolderView({ Widget buildFolderView({
@required FolderViewType viewType, @required FolderViewType viewType,
@required NotesFolder folder, @required NotesFolder folder,
@ -30,6 +28,7 @@ Widget buildFolderView({
@required bool showSummary, @required bool showSummary,
@required NoteSelectedFunction noteTapped, @required NoteSelectedFunction noteTapped,
@required NoteSelectedFunction noteLongPressed, @required NoteSelectedFunction noteLongPressed,
@required NoteBoolPropertyFunction isNoteSelected,
}) { }) {
switch (viewType) { switch (viewType) {
case FolderViewType.Standard: case FolderViewType.Standard:
@ -40,6 +39,7 @@ Widget buildFolderView({
emptyText: emptyText, emptyText: emptyText,
headerType: header, headerType: header,
showSummary: showSummary, showSummary: showSummary,
isNoteSelected: isNoteSelected,
); );
case FolderViewType.Journal: case FolderViewType.Journal:
return JournalView( return JournalView(
@ -47,6 +47,7 @@ Widget buildFolderView({
noteTapped: noteTapped, noteTapped: noteTapped,
noteLongPressed: noteLongPressed, noteLongPressed: noteLongPressed,
emptyText: emptyText, emptyText: emptyText,
isNoteSelected: isNoteSelected,
); );
case FolderViewType.Card: case FolderViewType.Card:
return CardView( return CardView(
@ -54,6 +55,7 @@ Widget buildFolderView({
noteTapped: noteTapped, noteTapped: noteTapped,
noteLongPressed: noteLongPressed, noteLongPressed: noteLongPressed,
emptyText: emptyText, emptyText: emptyText,
isNoteSelected: isNoteSelected,
); );
case FolderViewType.Grid: case FolderViewType.Grid:
return GridFolderView( return GridFolderView(
@ -61,6 +63,7 @@ Widget buildFolderView({
noteTapped: noteTapped, noteTapped: noteTapped,
noteLongPressed: noteLongPressed, noteLongPressed: noteLongPressed,
emptyText: emptyText, emptyText: emptyText,
isNoteSelected: isNoteSelected,
); );
} }

View File

@ -1,13 +1,15 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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/card_view.dart'; import 'package:gitjournal/folder_views/card_view.dart';
import 'package:gitjournal/folder_views/note_tile.dart';
class GridFolderView extends StatelessWidget { class GridFolderView extends StatelessWidget {
final NoteSelectedFunction noteTapped; final NoteSelectedFunction noteTapped;
final NoteSelectedFunction noteLongPressed; final NoteSelectedFunction noteLongPressed;
final NoteBoolPropertyFunction isNoteSelected;
final NotesFolder folder; final NotesFolder folder;
final String emptyText; final String emptyText;
@ -15,6 +17,7 @@ class GridFolderView extends StatelessWidget {
@required this.folder, @required this.folder,
@required this.noteTapped, @required this.noteTapped,
@required this.noteLongPressed, @required this.noteLongPressed,
@required this.isNoteSelected,
@required this.emptyText, @required this.emptyText,
}); });
@ -26,6 +29,7 @@ class GridFolderView extends StatelessWidget {
noteLongPressed: noteLongPressed, noteLongPressed: noteLongPressed,
emptyText: emptyText, emptyText: emptyText,
fixedHeight: true, fixedHeight: true,
isNoteSelected: isNoteSelected,
); );
} }
} }

View File

@ -11,6 +11,8 @@ import 'package:gitjournal/folder_views/list_view.dart';
class JournalView extends StatelessWidget { class JournalView extends StatelessWidget {
final NoteSelectedFunction noteTapped; final NoteSelectedFunction noteTapped;
final NoteSelectedFunction noteLongPressed; final NoteSelectedFunction noteLongPressed;
final NoteBoolPropertyFunction isNoteSelected;
final NotesFolder folder; final NotesFolder folder;
final String emptyText; final String emptyText;
@ -21,16 +23,17 @@ class JournalView extends StatelessWidget {
@required this.folder, @required this.folder,
@required this.noteTapped, @required this.noteTapped,
@required this.noteLongPressed, @required this.noteLongPressed,
@required this.isNoteSelected,
@required this.emptyText, @required this.emptyText,
}); });
@override
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return FolderListView( return FolderListView(
folder: folder, folder: folder,
emptyText: emptyText, emptyText: emptyText,
noteTileBuilder: _buildRow, noteTileBuilder: _buildRow,
isNoteSelected: isNoteSelected,
); );
} }

View File

@ -10,11 +10,11 @@ import 'package:gitjournal/state_container.dart';
import 'package:gitjournal/utils.dart'; import 'package:gitjournal/utils.dart';
import 'package:gitjournal/widgets/icon_dismissable.dart'; import 'package:gitjournal/widgets/icon_dismissable.dart';
typedef void NoteSelectedFunction(Note note);
typedef Widget NoteTileBuilder(BuildContext context, Note note); typedef Widget NoteTileBuilder(BuildContext context, Note note);
class FolderListView extends StatefulWidget { class FolderListView extends StatefulWidget {
final NoteTileBuilder noteTileBuilder; final NoteTileBuilder noteTileBuilder;
final NoteBoolPropertyFunction isNoteSelected;
final NotesFolder folder; final NotesFolder folder;
final String emptyText; final String emptyText;
@ -22,6 +22,7 @@ class FolderListView extends StatefulWidget {
@required this.folder, @required this.folder,
@required this.noteTileBuilder, @required this.noteTileBuilder,
@required this.emptyText, @required this.emptyText,
@required this.isNoteSelected,
}); });
@override @override
@ -80,7 +81,7 @@ class _FolderListViewState extends State<FolderListView> {
_listKey.currentState.removeItem(index, (context, animation) { _listKey.currentState.removeItem(index, (context, animation) {
var i = deletedViaDismissed.indexWhere((path) => path == note.filePath); var i = deletedViaDismissed.indexWhere((path) => path == note.filePath);
if (i == -1) { if (i == -1) {
return _buildNote(context, note, animation); return _buildNote(note, widget.isNoteSelected(note), animation);
} else { } else {
deletedViaDismissed.removeAt(i); deletedViaDismissed.removeAt(i);
return Container(); return Container();
@ -122,12 +123,12 @@ class _FolderListViewState extends State<FolderListView> {
} }
var note = widget.folder.notes[i]; var note = widget.folder.notes[i];
return _buildNote(context, note, animation); return _buildNote(note, widget.isNoteSelected(note), animation);
} }
Widget _buildNote( Widget _buildNote(
BuildContext context,
Note note, Note note,
bool selected,
Animation<double> animation, Animation<double> animation,
) { ) {
var settings = Provider.of<Settings>(context); var settings = Provider.of<Settings>(context);
@ -163,6 +164,16 @@ class _FolderListViewState extends State<FolderListView> {
); );
} }
if (selected) {
var borderColor = Theme.of(context).accentColor;
viewItem = Container(
decoration: BoxDecoration(
border: Border.all(color: borderColor, width: selected ? 2.0 : 1.0),
),
child: viewItem,
);
}
return SizeTransition( return SizeTransition(
key: ValueKey("FolderListView_tr_" + note.filePath), key: ValueKey("FolderListView_tr_" + note.filePath),
axis: Axis.vertical, axis: Axis.vertical,

View File

@ -5,17 +5,17 @@ import 'package:flutter/material.dart';
import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/utils/markdown.dart'; import 'package:gitjournal/utils/markdown.dart';
typedef void NoteSelectedFunction(Note note);
class NoteTile extends StatelessWidget { class NoteTile extends StatelessWidget {
final Note note; final Note note;
final NoteSelectedFunction noteTapped; final NoteSelectedFunction noteTapped;
final NoteSelectedFunction noteLongPressed; final NoteSelectedFunction noteLongPressed;
final bool selected;
NoteTile({ NoteTile({
@required this.note, @required this.note,
@required this.noteTapped, @required this.noteTapped,
@required this.noteLongPressed, @required this.noteLongPressed,
@required this.selected,
}); });
@override @override
@ -40,10 +40,14 @@ class NoteTile extends StatelessWidget {
borderColor = theme.highlightColor.withAlpha(30); borderColor = theme.highlightColor.withAlpha(30);
} }
if (selected) {
borderColor = theme.accentColor;
}
var tileContent = Container( var tileContent = Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(8)), borderRadius: const BorderRadius.all(Radius.circular(8)),
border: Border.all(color: borderColor), border: Border.all(color: borderColor, width: selected ? 2.0 : 1.0),
), ),
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
child: Column( child: Column(

View File

@ -17,6 +17,8 @@ enum StandardViewHeader {
class StandardView extends StatelessWidget { class StandardView extends StatelessWidget {
final NoteSelectedFunction noteTapped; final NoteSelectedFunction noteTapped;
final NoteSelectedFunction noteLongPressed; final NoteSelectedFunction noteLongPressed;
final NoteBoolPropertyFunction isNoteSelected;
final NotesFolder folder; final NotesFolder folder;
final String emptyText; final String emptyText;
@ -32,6 +34,7 @@ class StandardView extends StatelessWidget {
@required this.emptyText, @required this.emptyText,
@required this.headerType, @required this.headerType,
@required this.showSummary, @required this.showSummary,
@required this.isNoteSelected,
}); });
@override @override
@ -41,6 +44,7 @@ class StandardView extends StatelessWidget {
folder: folder, folder: folder,
emptyText: emptyText, emptyText: emptyText,
noteTileBuilder: _buildRow, noteTileBuilder: _buildRow,
isNoteSelected: isNoteSelected,
); );
} }

View File

@ -99,8 +99,7 @@ class _FolderViewState extends State<FolderView> {
} }
}, },
noteLongPressed: (Note note) { noteLongPressed: (Note note) {
// Disabled for now, until I figure out how to render // Disabled for now, until I expose actions for the note
// the selected note differently
/* /*
setState(() { setState(() {
inSelectionMode = true; inSelectionMode = true;
@ -108,6 +107,7 @@ class _FolderViewState extends State<FolderView> {
}); });
*/ */
}, },
isNoteSelected: (n) => n == selectedNote,
); );
}, },
); );

View File

@ -85,6 +85,7 @@ class NoteSearchDelegate extends SearchDelegate<Note> {
showSummary: true, showSummary: true,
noteTapped: (Note note) => openNoteEditor(context, note, folder), noteTapped: (Note note) => openNoteEditor(context, note, folder),
noteLongPressed: (Note note) {}, noteLongPressed: (Note note) {},
isNoteSelected: (n) => false,
); );
} }
} }