mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-27 01:02:14 +08:00
FolderSelectionDialog: Make it prettier
We don't need it to have such large icons.
This commit is contained in:
@ -1,6 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gitjournal/core/notes_folder.dart';
|
import 'package:gitjournal/core/notes_folder.dart';
|
||||||
import 'package:gitjournal/widgets/folder_tree_view.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
typedef NoteFolderCallback = void Function(NotesFolder);
|
typedef NoteFolderCallback = void Function(NotesFolder);
|
||||||
@ -17,7 +16,6 @@ class FolderSelectionDialog extends StatelessWidget {
|
|||||||
onFolderEntered: (NotesFolder destFolder) {
|
onFolderEntered: (NotesFolder destFolder) {
|
||||||
Navigator.of(context).pop(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: <Widget>[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<FolderMiniTile> {
|
||||||
|
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: <Widget>[
|
||||||
|
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 = <FolderMiniTile>[];
|
||||||
|
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,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -10,7 +10,6 @@ class FolderTreeView extends StatefulWidget {
|
|||||||
final FolderSelectedCallback onFolderSelected;
|
final FolderSelectedCallback onFolderSelected;
|
||||||
final Function onFolderUnselected;
|
final Function onFolderUnselected;
|
||||||
final FolderSelectedCallback onFolderEntered;
|
final FolderSelectedCallback onFolderEntered;
|
||||||
final bool longPressAllowed;
|
|
||||||
|
|
||||||
FolderTreeView({
|
FolderTreeView({
|
||||||
Key key,
|
Key key,
|
||||||
@ -18,7 +17,6 @@ class FolderTreeView extends StatefulWidget {
|
|||||||
@required this.onFolderEntered,
|
@required this.onFolderEntered,
|
||||||
this.onFolderSelected = _doNothing,
|
this.onFolderSelected = _doNothing,
|
||||||
this.onFolderUnselected = _doNothing,
|
this.onFolderUnselected = _doNothing,
|
||||||
this.longPressAllowed = true,
|
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -47,7 +45,6 @@ class FolderTreeViewState extends State<FolderTreeView> {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: (folder) {
|
onLongPress: (folder) {
|
||||||
if (!widget.longPressAllowed) return;
|
|
||||||
setState(() {
|
setState(() {
|
||||||
inSelectionMode = true;
|
inSelectionMode = true;
|
||||||
selectedFolder = folder;
|
selectedFolder = folder;
|
||||||
|
Reference in New Issue
Block a user