mirror of
https://gitlab.com/nkming2/nc-photos.git
synced 2025-02-02 06:46:22 +01:00
Add a link to trash after removing items
This commit is contained in:
parent
0356e22be7
commit
7573f00bfb
7 changed files with 54 additions and 1 deletions
25
app/lib/navigation_manager.dart
Normal file
25
app/lib/navigation_manager.dart
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
|
class NavigationManager {
|
||||||
|
factory NavigationManager() => _inst;
|
||||||
|
|
||||||
|
NavigationManager._();
|
||||||
|
|
||||||
|
void setHandler(NavigationHandler handler) {
|
||||||
|
_handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
void unsetHandler(NavigationHandler handler) {
|
||||||
|
_handler = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
NavigatorState? getNavigator() => _handler?.getNavigator();
|
||||||
|
|
||||||
|
NavigationHandler? _handler;
|
||||||
|
|
||||||
|
static final _inst = NavigationManager._();
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class NavigationHandler {
|
||||||
|
NavigatorState? getNavigator();
|
||||||
|
}
|
|
@ -333,6 +333,7 @@ class _FavoriteBrowserState extends State<FavoriteBrowser>
|
||||||
await RemoveSelectionHandler()(
|
await RemoveSelectionHandler()(
|
||||||
account: widget.account,
|
account: widget.account,
|
||||||
selectedFiles: selectedFiles,
|
selectedFiles: selectedFiles,
|
||||||
|
isMoveToTrash: true,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,10 @@ import 'package:nc_photos/debug_util.dart';
|
||||||
import 'package:nc_photos/di_container.dart';
|
import 'package:nc_photos/di_container.dart';
|
||||||
import 'package:nc_photos/entity/file.dart';
|
import 'package:nc_photos/entity/file.dart';
|
||||||
import 'package:nc_photos/k.dart' as k;
|
import 'package:nc_photos/k.dart' as k;
|
||||||
|
import 'package:nc_photos/navigation_manager.dart';
|
||||||
import 'package:nc_photos/snack_bar_manager.dart';
|
import 'package:nc_photos/snack_bar_manager.dart';
|
||||||
import 'package:nc_photos/use_case/remove.dart';
|
import 'package:nc_photos/use_case/remove.dart';
|
||||||
|
import 'package:nc_photos/widget/trashbin_browser.dart';
|
||||||
|
|
||||||
class RemoveSelectionHandler {
|
class RemoveSelectionHandler {
|
||||||
/// Remove [selectedFiles] and return the removed count
|
/// Remove [selectedFiles] and return the removed count
|
||||||
|
@ -17,6 +19,7 @@ class RemoveSelectionHandler {
|
||||||
required List<File> selectedFiles,
|
required List<File> selectedFiles,
|
||||||
bool shouldCleanupAlbum = true,
|
bool shouldCleanupAlbum = true,
|
||||||
bool isRemoveOpened = false,
|
bool isRemoveOpened = false,
|
||||||
|
bool isMoveToTrash = false,
|
||||||
}) async {
|
}) async {
|
||||||
final String processingText, successText;
|
final String processingText, successText;
|
||||||
final String Function(int) failureText;
|
final String Function(int) failureText;
|
||||||
|
@ -52,15 +55,27 @@ class RemoveSelectionHandler {
|
||||||
},
|
},
|
||||||
shouldCleanUp: shouldCleanupAlbum,
|
shouldCleanUp: shouldCleanupAlbum,
|
||||||
);
|
);
|
||||||
|
final trashAction = isMoveToTrash
|
||||||
|
? SnackBarAction(
|
||||||
|
label: L10n.global().albumTrashLabel,
|
||||||
|
onPressed: () {
|
||||||
|
NavigationManager().getNavigator()?.pushNamed(
|
||||||
|
TrashbinBrowser.routeName,
|
||||||
|
arguments: TrashbinBrowserArguments(account));
|
||||||
|
},
|
||||||
|
)
|
||||||
|
: null;
|
||||||
if (failureCount == 0) {
|
if (failureCount == 0) {
|
||||||
SnackBarManager().showSnackBar(SnackBar(
|
SnackBarManager().showSnackBar(SnackBar(
|
||||||
content: Text(successText),
|
content: Text(successText),
|
||||||
duration: k.snackBarDurationNormal,
|
duration: k.snackBarDurationNormal,
|
||||||
|
action: trashAction,
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
SnackBarManager().showSnackBar(SnackBar(
|
SnackBarManager().showSnackBar(SnackBar(
|
||||||
content: Text(failureText(failureCount)),
|
content: Text(failureText(failureCount)),
|
||||||
duration: k.snackBarDurationNormal,
|
duration: k.snackBarDurationNormal,
|
||||||
|
action: trashAction,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
return selectedFiles.length - failureCount;
|
return selectedFiles.length - failureCount;
|
||||||
|
|
|
@ -425,6 +425,7 @@ class _HomePhotosState extends State<HomePhotos>
|
||||||
await RemoveSelectionHandler()(
|
await RemoveSelectionHandler()(
|
||||||
account: widget.account,
|
account: widget.account,
|
||||||
selectedFiles: selectedFiles,
|
selectedFiles: selectedFiles,
|
||||||
|
isMoveToTrash: true,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:nc_photos/event/event.dart';
|
import 'package:nc_photos/event/event.dart';
|
||||||
import 'package:nc_photos/language_util.dart' as language_util;
|
import 'package:nc_photos/language_util.dart' as language_util;
|
||||||
|
import 'package:nc_photos/navigation_manager.dart';
|
||||||
import 'package:nc_photos/pref.dart';
|
import 'package:nc_photos/pref.dart';
|
||||||
import 'package:nc_photos/snack_bar_manager.dart';
|
import 'package:nc_photos/snack_bar_manager.dart';
|
||||||
import 'package:nc_photos/theme.dart';
|
import 'package:nc_photos/theme.dart';
|
||||||
|
@ -49,11 +50,13 @@ class MyApp extends StatefulWidget {
|
||||||
static late BuildContext _globalContext;
|
static late BuildContext _globalContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
class _MyAppState extends State<MyApp> implements SnackBarHandler {
|
class _MyAppState extends State<MyApp>
|
||||||
|
implements SnackBarHandler, NavigationHandler {
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
SnackBarManager().registerHandler(this);
|
SnackBarManager().registerHandler(this);
|
||||||
|
NavigationManager().setHandler(this);
|
||||||
_themeChangedListener =
|
_themeChangedListener =
|
||||||
AppEventListener<ThemeChangedEvent>(_onThemeChangedEvent)..begin();
|
AppEventListener<ThemeChangedEvent>(_onThemeChangedEvent)..begin();
|
||||||
_langChangedListener =
|
_langChangedListener =
|
||||||
|
@ -77,6 +80,7 @@ class _MyAppState extends State<MyApp> implements SnackBarHandler {
|
||||||
initialRoute: Splash.routeName,
|
initialRoute: Splash.routeName,
|
||||||
onGenerateRoute: _onGenerateRoute,
|
onGenerateRoute: _onGenerateRoute,
|
||||||
navigatorObservers: <NavigatorObserver>[MyApp.routeObserver],
|
navigatorObservers: <NavigatorObserver>[MyApp.routeObserver],
|
||||||
|
navigatorKey: _navigatorKey,
|
||||||
scaffoldMessengerKey: _scaffoldMessengerKey,
|
scaffoldMessengerKey: _scaffoldMessengerKey,
|
||||||
locale: language_util.getSelectedLocale(),
|
locale: language_util.getSelectedLocale(),
|
||||||
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||||||
|
@ -107,6 +111,7 @@ class _MyAppState extends State<MyApp> implements SnackBarHandler {
|
||||||
void dispose() {
|
void dispose() {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
SnackBarManager().unregisterHandler(this);
|
SnackBarManager().unregisterHandler(this);
|
||||||
|
NavigationManager().unsetHandler(this);
|
||||||
_themeChangedListener.end();
|
_themeChangedListener.end();
|
||||||
_langChangedListener.end();
|
_langChangedListener.end();
|
||||||
}
|
}
|
||||||
|
@ -115,6 +120,9 @@ class _MyAppState extends State<MyApp> implements SnackBarHandler {
|
||||||
showSnackBar(SnackBar snackBar) =>
|
showSnackBar(SnackBar snackBar) =>
|
||||||
_scaffoldMessengerKey.currentState?.showSnackBar(snackBar);
|
_scaffoldMessengerKey.currentState?.showSnackBar(snackBar);
|
||||||
|
|
||||||
|
@override
|
||||||
|
getNavigator() => _navigatorKey.currentState;
|
||||||
|
|
||||||
ThemeData _getLightTheme() => ThemeData(
|
ThemeData _getLightTheme() => ThemeData(
|
||||||
brightness: Brightness.light,
|
brightness: Brightness.light,
|
||||||
primarySwatch: AppTheme.primarySwatchLight,
|
primarySwatch: AppTheme.primarySwatchLight,
|
||||||
|
@ -489,6 +497,7 @@ class _MyAppState extends State<MyApp> implements SnackBarHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
final _scaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
|
final _scaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
|
||||||
|
final _navigatorKey = GlobalKey<NavigatorState>();
|
||||||
|
|
||||||
late AppEventListener<ThemeChangedEvent> _themeChangedListener;
|
late AppEventListener<ThemeChangedEvent> _themeChangedListener;
|
||||||
late AppEventListener<LanguageChangedEvent> _langChangedListener;
|
late AppEventListener<LanguageChangedEvent> _langChangedListener;
|
||||||
|
|
|
@ -392,6 +392,7 @@ class _PersonBrowserState extends State<PersonBrowser>
|
||||||
await RemoveSelectionHandler()(
|
await RemoveSelectionHandler()(
|
||||||
account: widget.account,
|
account: widget.account,
|
||||||
selectedFiles: selectedFiles,
|
selectedFiles: selectedFiles,
|
||||||
|
isMoveToTrash: true,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -568,6 +568,7 @@ class _ViewerState extends State<Viewer>
|
||||||
account: widget.account,
|
account: widget.account,
|
||||||
selectedFiles: [file],
|
selectedFiles: [file],
|
||||||
isRemoveOpened: true,
|
isRemoveOpened: true,
|
||||||
|
isMoveToTrash: true,
|
||||||
);
|
);
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
|
|
Loading…
Reference in a new issue