diff --git a/lib/widget/album_dir_picker.dart b/lib/widget/album_dir_picker.dart index 6624b36f..f403df7f 100644 --- a/lib/widget/album_dir_picker.dart +++ b/lib/widget/album_dir_picker.dart @@ -5,6 +5,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:logging/logging.dart'; import 'package:nc_photos/account.dart'; import 'package:nc_photos/api/api_util.dart' as api_util; +import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/iterable_extension.dart'; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/snack_bar_manager.dart'; @@ -61,6 +62,13 @@ class _AlbumDirPickerState extends State @override getAccount() => widget.account; + @override + canPickDir(File dir) { + final root = api_util.getWebdavRootUrlRelative(widget.account); + return widget.account.roots + .any((r) => dir.path == "$root/$r" || dir.path.startsWith("$root/$r/")); + } + Widget _buildContent(BuildContext context) { return SafeArea( child: Column( diff --git a/lib/widget/dir_picker_mixin.dart b/lib/widget/dir_picker_mixin.dart index 32ef49fa..b366f918 100644 --- a/lib/widget/dir_picker_mixin.dart +++ b/lib/widget/dir_picker_mixin.dart @@ -44,6 +44,9 @@ mixin DirPickerMixin on State { @protected List getPickedDirs() => UnmodifiableListView(_picks); + @protected + bool canPickDir(File file) => true; + void _initBloc() { _log.info("[_initBloc] Initialize bloc"); _bloc = LsDirBloc(); @@ -117,42 +120,50 @@ mixin DirPickerMixin on State { } Widget _buildItem(BuildContext context, LsDirBlocItem item) { + final canPick = canPickDir(item.file); final pickState = _isItemPicked(item); IconData iconData; - switch (pickState) { - case _PickState.picked: - iconData = Icons.check_box; - break; - case _PickState.childPicked: - iconData = Icons.indeterminate_check_box; - break; - case _PickState.notPicked: - default: - iconData = Icons.check_box_outline_blank; - break; + if (canPick) { + switch (pickState) { + case _PickState.picked: + iconData = Icons.check_box; + break; + case _PickState.childPicked: + iconData = Icons.indeterminate_check_box; + break; + case _PickState.notPicked: + default: + iconData = Icons.check_box_outline_blank; + break; + } } return ListTile( dense: true, - leading: IconButton( - icon: AnimatedSwitcher( - duration: k.animationDurationShort, - transitionBuilder: (child, animation) => - ScaleTransition(child: child, scale: animation), - child: Icon( - iconData, - key: ValueKey(pickState), - ), - ), - onPressed: () { - if (pickState == _PickState.picked) { - _unpick(item); - } else { - _pick(item); - } - }, - ), + leading: canPick + ? IconButton( + icon: AnimatedSwitcher( + duration: k.animationDurationShort, + transitionBuilder: (child, animation) => + ScaleTransition(child: child, scale: animation), + child: Icon( + iconData, + key: ValueKey(pickState), + ), + ), + onPressed: () { + if (pickState == _PickState.picked) { + _unpick(item); + } else { + _pick(item); + } + }, + ) + : IconButton( + icon: Icon(null), + onPressed: null, + ), title: Text(path.basename(item.file.path)), trailing: item.children.isNotEmpty ? const Icon(Icons.arrow_forward_ios) : null,