move selectedItems to file controller model

This commit is contained in:
csf 2023-03-09 18:05:09 +09:00
parent 970dfa3c88
commit 5ae3d33f3c
2 changed files with 38 additions and 38 deletions

View File

@ -358,8 +358,6 @@ class _FileManagerViewState extends State<FileManagerView> {
final _modifiedColWidth = kDesktopFileTransferModifiedColWidth.obs; final _modifiedColWidth = kDesktopFileTransferModifiedColWidth.obs;
final _fileListScrollController = ScrollController(); final _fileListScrollController = ScrollController();
late final _selectedItems = SelectedItems(isLocal: isLocal);
/// [_lastClickTime], [_lastClickEntry] help to handle double click /// [_lastClickTime], [_lastClickEntry] help to handle double click
var _lastClickTime = var _lastClickTime =
DateTime.now().millisecondsSinceEpoch - bind.getDoubleClickTime() - 1000; DateTime.now().millisecondsSinceEpoch - bind.getDoubleClickTime() - 1000;
@ -368,6 +366,7 @@ class _FileManagerViewState extends State<FileManagerView> {
FileController get controller => widget.controller; FileController get controller => widget.controller;
bool get isLocal => widget.controller.isLocal; bool get isLocal => widget.controller.isLocal;
FFI get _ffi => widget._ffi; FFI get _ffi => widget._ffi;
SelectedItems get selectedItems => controller.selectedItems;
@override @override
void initState() { void initState() {
@ -491,7 +490,7 @@ class _FileManagerViewState extends State<FileManagerView> {
color: Theme.of(context).cardColor, color: Theme.of(context).cardColor,
hoverColor: Theme.of(context).hoverColor, hoverColor: Theme.of(context).hoverColor,
onPressed: () { onPressed: () {
_selectedItems.clear(); selectedItems.clear();
controller.goBack(); controller.goBack();
}, },
), ),
@ -506,7 +505,7 @@ class _FileManagerViewState extends State<FileManagerView> {
color: Theme.of(context).cardColor, color: Theme.of(context).cardColor,
hoverColor: Theme.of(context).hoverColor, hoverColor: Theme.of(context).hoverColor,
onPressed: () { onPressed: () {
_selectedItems.clear(); selectedItems.clear();
controller.goToParentDirectory(); controller.goToParentDirectory();
}, },
), ),
@ -703,10 +702,10 @@ class _FileManagerViewState extends State<FileManagerView> {
hoverColor: Theme.of(context).hoverColor, hoverColor: Theme.of(context).hoverColor,
), ),
MenuButton( MenuButton(
onPressed: validItems(_selectedItems) onPressed: selectedItems.valid()
? () async { ? () async {
await (controller.removeAction(_selectedItems)); await (controller.removeAction(selectedItems));
_selectedItems.clear(); selectedItems.clear();
} }
: null, : null,
child: SvgPicture.asset( child: SvgPicture.asset(
@ -726,17 +725,17 @@ class _FileManagerViewState extends State<FileManagerView> {
? EdgeInsets.only(left: 10) ? EdgeInsets.only(left: 10)
: EdgeInsets.only(right: 10)), : EdgeInsets.only(right: 10)),
backgroundColor: MaterialStateProperty.all( backgroundColor: MaterialStateProperty.all(
_selectedItems.length == 0 selectedItems.length == 0
? MyTheme.accent80 ? MyTheme.accent80
: MyTheme.accent, : MyTheme.accent,
), ),
), ),
onPressed: validItems(_selectedItems) onPressed: selectedItems.valid()
? () { ? () {
final otherSideData = final otherSideData =
controller.getOtherSideDirectoryData(); controller.getOtherSideDirectoryData();
controller.sendFiles(_selectedItems, otherSideData); controller.sendFiles(selectedItems, otherSideData);
_selectedItems.clear(); selectedItems.clear();
} }
: null, : null,
icon: isLocal icon: isLocal
@ -744,7 +743,7 @@ class _FileManagerViewState extends State<FileManagerView> {
translate('Send'), translate('Send'),
textAlign: TextAlign.right, textAlign: TextAlign.right,
style: TextStyle( style: TextStyle(
color: _selectedItems.length == 0 color: selectedItems.length == 0
? Theme.of(context).brightness == Brightness.light ? Theme.of(context).brightness == Brightness.light
? MyTheme.grayBg ? MyTheme.grayBg
: MyTheme.darkGray : MyTheme.darkGray
@ -755,7 +754,7 @@ class _FileManagerViewState extends State<FileManagerView> {
quarterTurns: 2, quarterTurns: 2,
child: SvgPicture.asset( child: SvgPicture.asset(
"assets/arrow.svg", "assets/arrow.svg",
color: _selectedItems.length == 0 color: selectedItems.length == 0
? Theme.of(context).brightness == Brightness.light ? Theme.of(context).brightness == Brightness.light
? MyTheme.grayBg ? MyTheme.grayBg
: MyTheme.darkGray : MyTheme.darkGray
@ -766,7 +765,7 @@ class _FileManagerViewState extends State<FileManagerView> {
label: isLocal label: isLocal
? SvgPicture.asset( ? SvgPicture.asset(
"assets/arrow.svg", "assets/arrow.svg",
color: _selectedItems.length == 0 color: selectedItems.length == 0
? Theme.of(context).brightness == Brightness.light ? Theme.of(context).brightness == Brightness.light
? MyTheme.grayBg ? MyTheme.grayBg
: MyTheme.darkGray : MyTheme.darkGray
@ -775,7 +774,7 @@ class _FileManagerViewState extends State<FileManagerView> {
: Text( : Text(
translate('Receive'), translate('Receive'),
style: TextStyle( style: TextStyle(
color: _selectedItems.length == 0 color: selectedItems.length == 0
? Theme.of(context).brightness == Brightness.light ? Theme.of(context).brightness == Brightness.light
? MyTheme.grayBg ? MyTheme.grayBg
: MyTheme.darkGray : MyTheme.darkGray
@ -809,13 +808,13 @@ class _FileManagerViewState extends State<FileManagerView> {
MenuEntryButton( MenuEntryButton(
childBuilder: (style) => Text(translate("Select All"), style: style), childBuilder: (style) => Text(translate("Select All"), style: style),
proc: () => setState(() => proc: () => setState(() =>
_selectedItems.selectAll(controller.directory.value.entries)), selectedItems.selectAll(controller.directory.value.entries)),
padding: kDesktopMenuPadding, padding: kDesktopMenuPadding,
dismissOnClicked: true), dismissOnClicked: true),
MenuEntryButton( MenuEntryButton(
childBuilder: (style) => childBuilder: (style) =>
Text(translate("Unselect All"), style: style), Text(translate("Unselect All"), style: style),
proc: () => setState(() => _selectedItems.clear()), proc: () => setState(() => selectedItems.clear()),
padding: kDesktopMenuPadding, padding: kDesktopMenuPadding,
dismissOnClicked: true) dismissOnClicked: true)
]; ];
@ -865,10 +864,10 @@ class _FileManagerViewState extends State<FileManagerView> {
onNext: (buffer) { onNext: (buffer) {
debugPrint("searching next for $buffer"); debugPrint("searching next for $buffer");
assert(buffer.length == 1); assert(buffer.length == 1);
assert(_selectedItems.length <= 1); assert(selectedItems.length <= 1);
var skipCount = 0; var skipCount = 0;
if (_selectedItems.items.isNotEmpty) { if (selectedItems.items.isNotEmpty) {
final index = entries.indexOf(_selectedItems.items.first); final index = entries.indexOf(selectedItems.items.first);
if (index < 0) { if (index < 0) {
return; return;
} }
@ -884,7 +883,7 @@ class _FileManagerViewState extends State<FileManagerView> {
(element) => element.name.toLowerCase().startsWith(buffer)); (element) => element.name.toLowerCase().startsWith(buffer));
} }
if (searchResult.isEmpty) { if (searchResult.isEmpty) {
setState(() => _selectedItems.clear()); setState(() => selectedItems.clear());
return; return;
} }
_jumpToEntry(isLocal, searchResult.first, scrollController, _jumpToEntry(isLocal, searchResult.first, scrollController,
@ -892,12 +891,12 @@ class _FileManagerViewState extends State<FileManagerView> {
}, },
onSearch: (buffer) { onSearch: (buffer) {
debugPrint("searching for $buffer"); debugPrint("searching for $buffer");
final selectedEntries = _selectedItems; final selectedEntries = selectedItems;
final searchResult = entries final searchResult = entries
.where((element) => element.name.toLowerCase().startsWith(buffer)); .where((element) => element.name.toLowerCase().startsWith(buffer));
selectedEntries.clear(); selectedEntries.clear();
if (searchResult.isEmpty) { if (searchResult.isEmpty) {
setState(() => _selectedItems.clear()); setState(() => selectedItems.clear());
return; return;
} }
_jumpToEntry(isLocal, searchResult.first, scrollController, _jumpToEntry(isLocal, searchResult.first, scrollController,
@ -916,7 +915,7 @@ class _FileManagerViewState extends State<FileManagerView> {
final lastModifiedStr = entry.isDrive final lastModifiedStr = entry.isDrive
? " " ? " "
: "${entry.lastModified().toString().replaceAll(".000", "")} "; : "${entry.lastModified().toString().replaceAll(".000", "")} ";
final isSelected = _selectedItems.contains(entry); final isSelected = selectedItems.contains(entry);
return Padding( return Padding(
padding: EdgeInsets.symmetric(vertical: 1), padding: EdgeInsets.symmetric(vertical: 1),
child: Container( child: Container(
@ -970,7 +969,7 @@ class _FileManagerViewState extends State<FileManagerView> {
)), )),
), ),
onTap: () { onTap: () {
final items = _selectedItems; final items = selectedItems;
// handle double click // handle double click
if (_checkDoubleClick(entry)) { if (_checkDoubleClick(entry)) {
controller.openDirectory(entry.path); controller.openDirectory(entry.path);
@ -1056,7 +1055,7 @@ class _FileManagerViewState extends State<FileManagerView> {
} }
onSearchText(String searchText, bool isLocal) { onSearchText(String searchText, bool isLocal) {
_selectedItems.clear(); selectedItems.clear();
_searchText.value = searchText; _searchText.value = searchText;
} }
@ -1067,7 +1066,7 @@ class _FileManagerViewState extends State<FileManagerView> {
if (index == -1) { if (index == -1) {
debugPrint("entry is not valid: ${entry.path}"); debugPrint("entry is not valid: ${entry.path}");
} }
final selectedEntries = _selectedItems; final selectedEntries = selectedItems;
final searchResult = entries.where((element) => element == entry); final searchResult = entries.where((element) => element == entry);
selectedEntries.clear(); selectedEntries.clear();
if (searchResult.isEmpty) { if (searchResult.isEmpty) {
@ -1431,14 +1430,6 @@ class _FileManagerViewState extends State<FileManagerView> {
// } // }
} }
bool validItems(SelectedItems items) {
if (items.length > 0) {
// exclude DirDrive type
return items.items.any((item) => !item.isDrive);
}
return false;
}
Widget buildWindowsThisPC(BuildContext context, [TextStyle? textStyle]) { Widget buildWindowsThisPC(BuildContext context, [TextStyle? textStyle]) {
final color = Theme.of(context).iconTheme.color?.withOpacity(0.7); final color = Theme.of(context).iconTheme.color?.withOpacity(0.7);
return Row(children: [ return Row(children: [

View File

@ -214,6 +214,7 @@ class FileController {
final OverlayDialogManager? dialogManager; final OverlayDialogManager? dialogManager;
final DirectoryData Function() getOtherSideDirectoryData; final DirectoryData Function() getOtherSideDirectoryData;
late final SelectedItems selectedItems = SelectedItems(isLocal: isLocal);
FileController( FileController(
{required this.isLocal, {required this.isLocal,
@ -1059,7 +1060,7 @@ class SelectedItems {
SelectedItems({required this.isLocal}); SelectedItems({required this.isLocal});
add(Entry e) { void add(Entry e) {
if (e.isDrive) return; if (e.isDrive) return;
if (!_items.contains(e)) { if (!_items.contains(e)) {
_items.add(e); _items.add(e);
@ -1070,11 +1071,11 @@ class SelectedItems {
return _items.contains(e); return _items.contains(e);
} }
remove(Entry e) { void remove(Entry e) {
_items.remove(e); _items.remove(e);
} }
clear() { void clear() {
_items.clear(); _items.clear();
} }
@ -1082,6 +1083,14 @@ class SelectedItems {
_items.clear(); _items.clear();
_items.addAll(entries); _items.addAll(entries);
} }
bool valid() {
if (length > 0) {
// exclude DirDrive type
return items.any((item) => !item.isDrive);
}
return false;
}
} }
// edited from [https://github.com/DevsOnFlutter/file_manager/blob/c1bf7f0225b15bcb86eba602c60acd5c4da90dd8/lib/file_manager.dart#L22] // edited from [https://github.com/DevsOnFlutter/file_manager/blob/c1bf7f0225b15bcb86eba602c60acd5c4da90dd8/lib/file_manager.dart#L22]