diff --git a/lib/widgets/folder_selection_dialog.dart b/lib/widgets/folder_selection_dialog.dart index a96add68..3d232ced 100644 --- a/lib/widgets/folder_selection_dialog.dart +++ b/lib/widgets/folder_selection_dialog.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:gitjournal/core/notes_folder.dart'; -import 'package:gitjournal/widgets/folder_tree_view.dart'; import 'package:provider/provider.dart'; typedef NoteFolderCallback = void Function(NotesFolder); @@ -17,7 +16,6 @@ class FolderSelectionDialog extends StatelessWidget { onFolderEntered: (NotesFolder destFolder) { Navigator.of(context).pop(destFolder); }, - longPressAllowed: false, ), ); @@ -28,4 +26,125 @@ class FolderSelectionDialog extends StatelessWidget { } } -// FIXME: Add the previously as a radio button selected Folder +typedef void FolderSelectedCallback(NotesFolder folder); + +class FolderTreeView extends StatelessWidget { + final NotesFolder rootFolder; + final FolderSelectedCallback onFolderEntered; + + FolderTreeView({ + Key key, + @required this.rootFolder, + @required this.onFolderEntered, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + var tile = FolderMiniTile( + folder: rootFolder, + onTap: onFolderEntered, + ); + + return ListView( + children: [tile], + ); + } +} + +class FolderMiniTile extends StatefulWidget { + final NotesFolder folder; + final FolderSelectedCallback onTap; + + FolderMiniTile({ + @required this.folder, + @required this.onTap, + }); + + @override + FolderMiniTileState createState() => FolderMiniTileState(); +} + +class FolderMiniTileState extends State { + final MainAxisSize mainAxisSize = MainAxisSize.min; + final CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.start; + final MainAxisAlignment mainAxisAlignment = MainAxisAlignment.center; + + bool _isExpanded = true; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: mainAxisSize, + crossAxisAlignment: crossAxisAlignment, + mainAxisAlignment: mainAxisAlignment, + children: [ + GestureDetector( + child: _buildFolderTile(), + onTap: () => widget.onTap(widget.folder), + ), + _getChild(), + ], + ); + } + + Widget _buildFolderTile() { + var folder = widget.folder; + var ic = _isExpanded ? Icons.keyboard_arrow_up : Icons.keyboard_arrow_down; + var trailling = folder.hasSubFolders + ? IconButton( + icon: Icon(ic), + onPressed: expand, + ) + : null; + + var folderName = folder.name; + if (folder.parent == null) { + folderName = "Notes"; + } + + return Card( + child: ListTile( + leading: Container( + width: 16, + height: 16, + alignment: Alignment.center, + child: Icon( + Icons.folder, + size: 24, + color: Theme.of(context).accentColor, + ), + ), + title: Text(folderName), + trailing: trailling, + ), + ); + } + + void expand() { + setState(() { + _isExpanded = !_isExpanded; + }); + } + + Widget _getChild() { + if (!_isExpanded) return Container(); + + var children = []; + widget.folder.getFolders().forEach((folder) { + children.add(FolderMiniTile( + folder: folder, + onTap: widget.onTap, + )); + }); + + return Container( + margin: const EdgeInsets.only(left: 8.0), + child: Column( + mainAxisAlignment: mainAxisAlignment, + crossAxisAlignment: crossAxisAlignment, + mainAxisSize: mainAxisSize, + children: children, + ), + ); + } +} diff --git a/lib/widgets/folder_tree_view.dart b/lib/widgets/folder_tree_view.dart index 6859061d..a3c661a4 100644 --- a/lib/widgets/folder_tree_view.dart +++ b/lib/widgets/folder_tree_view.dart @@ -10,7 +10,6 @@ class FolderTreeView extends StatefulWidget { final FolderSelectedCallback onFolderSelected; final Function onFolderUnselected; final FolderSelectedCallback onFolderEntered; - final bool longPressAllowed; FolderTreeView({ Key key, @@ -18,7 +17,6 @@ class FolderTreeView extends StatefulWidget { @required this.onFolderEntered, this.onFolderSelected = _doNothing, this.onFolderUnselected = _doNothing, - this.longPressAllowed = true, }) : super(key: key); @override @@ -47,7 +45,6 @@ class FolderTreeViewState extends State { } }, onLongPress: (folder) { - if (!widget.longPressAllowed) return; setState(() { inSelectionMode = true; selectedFolder = folder;