mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-29 02:07:39 +08:00
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:
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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(
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user