Support more buttons in viewer

This commit is contained in:
Ming Ming 2024-10-20 18:21:26 +08:00
parent d73fd18294
commit 7c583950f1
7 changed files with 143 additions and 1 deletions

View file

@ -29,6 +29,7 @@ import 'package:nc_photos/flutter_util.dart';
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/live_photo_util.dart'; import 'package:nc_photos/live_photo_util.dart';
import 'package:nc_photos/platform/features.dart' as features; import 'package:nc_photos/platform/features.dart' as features;
import 'package:nc_photos/set_as_handler.dart';
import 'package:nc_photos/share_handler.dart'; import 'package:nc_photos/share_handler.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';
@ -183,6 +184,10 @@ class _WrappedViewerState extends State<_WrappedViewer>
selector: (state) => state.slideshowRequest, selector: (state) => state.slideshowRequest,
listener: _onSlideshowRequest, listener: _onSlideshowRequest,
), ),
_BlocListenerT(
selector: (state) => state.setAsRequest,
listener: _onSetAsRequest,
),
_BlocListenerT( _BlocListenerT(
selector: (state) => state.error, selector: (state) => state.error,
listener: (context, error) { listener: (context, error) {
@ -257,6 +262,19 @@ class _WrappedViewerState extends State<_WrappedViewer>
context.addEvent(_RequestPage(newIndex)); context.addEvent(_RequestPage(newIndex));
} }
} }
void _onSetAsRequest(
BuildContext context,
Unique<_SetAsRequest?> setAsRequest,
) {
if (setAsRequest.value == null) {
return;
}
SetAsHandler(
KiwiContainer().resolve(),
context: context,
).setAsFile(setAsRequest.value!.account, setAsRequest.value!.file);
}
} }
typedef _BlocBuilder = BlocBuilder<_Bloc, _State>; typedef _BlocBuilder = BlocBuilder<_Bloc, _State>;

View file

@ -38,6 +38,7 @@ abstract class $_StateCopyWithWorker {
Unique<ImageEnhancerArguments?>? imageEnhancerRequest, Unique<ImageEnhancerArguments?>? imageEnhancerRequest,
Unique<_ShareRequest?>? shareRequest, Unique<_ShareRequest?>? shareRequest,
Unique<_SlideshowRequest?>? slideshowRequest, Unique<_SlideshowRequest?>? slideshowRequest,
Unique<_SetAsRequest?>? setAsRequest,
ExceptionEvent? error}); ExceptionEvent? error});
} }
@ -70,6 +71,7 @@ class _$_StateCopyWithWorkerImpl implements $_StateCopyWithWorker {
dynamic imageEnhancerRequest, dynamic imageEnhancerRequest,
dynamic shareRequest, dynamic shareRequest,
dynamic slideshowRequest, dynamic slideshowRequest,
dynamic setAsRequest,
dynamic error = copyWithNull}) { dynamic error = copyWithNull}) {
return _State( return _State(
fileIdOrders: fileIdOrders as List<int>? ?? that.fileIdOrders, fileIdOrders: fileIdOrders as List<int>? ?? that.fileIdOrders,
@ -121,6 +123,8 @@ class _$_StateCopyWithWorkerImpl implements $_StateCopyWithWorker {
shareRequest as Unique<_ShareRequest?>? ?? that.shareRequest, shareRequest as Unique<_ShareRequest?>? ?? that.shareRequest,
slideshowRequest: slideshowRequest as Unique<_SlideshowRequest?>? ?? slideshowRequest: slideshowRequest as Unique<_SlideshowRequest?>? ??
that.slideshowRequest, that.slideshowRequest,
setAsRequest:
setAsRequest as Unique<_SetAsRequest?>? ?? that.setAsRequest,
error: error == copyWithNull ? that.error : error as ExceptionEvent?); error: error == copyWithNull ? that.error : error as ExceptionEvent?);
} }
@ -202,7 +206,7 @@ extension _$_PageViewStateNpLog on _PageViewState {
extension _$_StateToString on _State { extension _$_StateToString on _State {
String _$toString() { String _$toString() {
// ignore: unnecessary_string_interpolations // ignore: unnecessary_string_interpolations
return "_State {fileIdOrders: $fileIdOrders, files: {length: ${files.length}}, fileStates: {length: ${fileStates.length}}, index: $index, currentFile: ${currentFile == null ? null : "${currentFile!.fdPath}"}, currentFileState: $currentFileState, collection: $collection, collectionItemsController: $collectionItemsController, collectionItems: ${collectionItems == null ? null : "{length: ${collectionItems!.length}}"}, isShowDetailPane: $isShowDetailPane, isClosingDetailPane: $isClosingDetailPane, isDetailPaneActive: $isDetailPaneActive, openDetailPaneRequest: $openDetailPaneRequest, closeDetailPane: $closeDetailPane, isZoomed: $isZoomed, isInitialLoad: $isInitialLoad, isShowAppBar: $isShowAppBar, appBarButtons: [length: ${appBarButtons.length}], bottomAppBarButtons: [length: ${bottomAppBarButtons.length}], pendingRemovePage: $pendingRemovePage, imageEditorRequest: $imageEditorRequest, imageEnhancerRequest: $imageEnhancerRequest, shareRequest: $shareRequest, slideshowRequest: $slideshowRequest, error: $error}"; return "_State {fileIdOrders: $fileIdOrders, files: {length: ${files.length}}, fileStates: {length: ${fileStates.length}}, index: $index, currentFile: ${currentFile == null ? null : "${currentFile!.fdPath}"}, currentFileState: $currentFileState, collection: $collection, collectionItemsController: $collectionItemsController, collectionItems: ${collectionItems == null ? null : "{length: ${collectionItems!.length}}"}, isShowDetailPane: $isShowDetailPane, isClosingDetailPane: $isClosingDetailPane, isDetailPaneActive: $isDetailPaneActive, openDetailPaneRequest: $openDetailPaneRequest, closeDetailPane: $closeDetailPane, isZoomed: $isZoomed, isInitialLoad: $isInitialLoad, isShowAppBar: $isShowAppBar, appBarButtons: [length: ${appBarButtons.length}], bottomAppBarButtons: [length: ${bottomAppBarButtons.length}], pendingRemovePage: $pendingRemovePage, imageEditorRequest: $imageEditorRequest, imageEnhancerRequest: $imageEnhancerRequest, shareRequest: $shareRequest, slideshowRequest: $slideshowRequest, setAsRequest: $setAsRequest, error: $error}";
} }
} }
@ -374,6 +378,13 @@ extension _$_StartSlideshowToString on _StartSlideshow {
} }
} }
extension _$_SetAsToString on _SetAs {
String _$toString() {
// ignore: unnecessary_string_interpolations
return "_SetAs {fileId: $fileId}";
}
}
extension _$_OpenDetailPaneToString on _OpenDetailPane { extension _$_OpenDetailPaneToString on _OpenDetailPane {
String _$toString() { String _$toString() {
// ignore: unnecessary_string_interpolations // ignore: unnecessary_string_interpolations

View file

@ -161,5 +161,13 @@ Widget? _buildAppBarButton(
return const _AppBarDownloadButton(); return const _AppBarDownloadButton();
case ViewerAppBarButtonType.delete: case ViewerAppBarButtonType.delete:
return collection == null ? const _AppBarDeleteButton() : null; return collection == null ? const _AppBarDeleteButton() : null;
case ViewerAppBarButtonType.archive:
return currentFile?.fdIsArchived == true
? const _AppBarUnarchiveButton()
: const _AppBarArchiveButton();
case ViewerAppBarButtonType.slideshow:
return const _AppBarSlideshowButton();
case ViewerAppBarButtonType.setAs:
return const _AppBarSetAsButton();
} }
} }

View file

@ -9,6 +9,9 @@ enum ViewerAppBarButtonType {
enhance, enhance,
download, download,
delete, delete,
archive,
slideshow,
setAs,
; ;
static ViewerAppBarButtonType fromValue(int value) => static ViewerAppBarButtonType fromValue(int value) =>
@ -158,3 +161,67 @@ class _AppBarDeleteButton extends StatelessWidget {
); );
} }
} }
class _AppBarUnarchiveButton extends StatelessWidget {
const _AppBarUnarchiveButton();
@override
Widget build(BuildContext context) {
return IconButton(
icon: const Icon(Icons.unarchive_outlined),
tooltip: L10n.global().unarchiveTooltip,
onPressed: () {
context.state.currentFile?.fdId
.let((id) => context.addEvent(_Unarchive(id)));
},
);
}
}
class _AppBarArchiveButton extends StatelessWidget {
const _AppBarArchiveButton();
@override
Widget build(BuildContext context) {
return IconButton(
icon: const Icon(Icons.archive_outlined),
tooltip: L10n.global().archiveTooltip,
onPressed: () {
context.state.currentFile?.fdId
.let((id) => context.addEvent(_Archive(id)));
},
);
}
}
class _AppBarSlideshowButton extends StatelessWidget {
const _AppBarSlideshowButton();
@override
Widget build(BuildContext context) {
return IconButton(
icon: const Icon(Icons.slideshow_outlined),
tooltip: L10n.global().slideshowTooltip,
onPressed: () {
context.state.currentFile?.fdId
.let((id) => context.addEvent(_StartSlideshow(id)));
},
);
}
}
class _AppBarSetAsButton extends StatelessWidget {
const _AppBarSetAsButton();
@override
Widget build(BuildContext context) {
return IconButton(
icon: const Icon(Icons.launch),
tooltip: L10n.global().setAsTooltip,
onPressed: () {
context.state.currentFile?.fdId
.let((id) => context.addEvent(_SetAs(id)));
},
);
}
}

View file

@ -45,6 +45,7 @@ class _Bloc extends Bloc<_Event, _State>
on<_Delete>(_onDelete); on<_Delete>(_onDelete);
on<_RemoveFromCollection>(_onRemoveFromCollection); on<_RemoveFromCollection>(_onRemoveFromCollection);
on<_StartSlideshow>(_onStartSlideshow); on<_StartSlideshow>(_onStartSlideshow);
on<_SetAs>(_onSetAs);
on<_OpenDetailPane>(_onOpenDetailPane); on<_OpenDetailPane>(_onOpenDetailPane);
on<_CloseDetailPane>(_onCloseDetailPane); on<_CloseDetailPane>(_onCloseDetailPane);
@ -350,6 +351,20 @@ class _Bloc extends Bloc<_Event, _State>
emit(state.copyWith(slideshowRequest: Unique(req))); emit(state.copyWith(slideshowRequest: Unique(req)));
} }
void _onSetAs(_SetAs ev, _Emitter emit) {
_log.info(ev);
final f = state.files[ev.fileId];
if (f == null) {
_log.severe("[_onSetAs] file is null: ${ev.fileId}");
return;
}
final req = _SetAsRequest(
account: account,
file: f,
);
emit(state.copyWith(setAsRequest: Unique(req)));
}
void _onOpenDetailPane(_OpenDetailPane ev, _Emitter emit) { void _onOpenDetailPane(_OpenDetailPane ev, _Emitter emit) {
_log.info(ev); _log.info(ev);
emit(state.copyWith( emit(state.copyWith(

View file

@ -28,6 +28,7 @@ class _State {
required this.imageEnhancerRequest, required this.imageEnhancerRequest,
required this.shareRequest, required this.shareRequest,
required this.slideshowRequest, required this.slideshowRequest,
required this.setAsRequest,
this.error, this.error,
}); });
@ -59,6 +60,7 @@ class _State {
imageEnhancerRequest: Unique(null), imageEnhancerRequest: Unique(null),
shareRequest: Unique(null), shareRequest: Unique(null),
slideshowRequest: Unique(null), slideshowRequest: Unique(null),
setAsRequest: Unique(null),
); );
@override @override
@ -94,6 +96,7 @@ class _State {
final Unique<ImageEnhancerArguments?> imageEnhancerRequest; final Unique<ImageEnhancerArguments?> imageEnhancerRequest;
final Unique<_ShareRequest?> shareRequest; final Unique<_ShareRequest?> shareRequest;
final Unique<_SlideshowRequest?> slideshowRequest; final Unique<_SlideshowRequest?> slideshowRequest;
final Unique<_SetAsRequest?> setAsRequest;
final ExceptionEvent? error; final ExceptionEvent? error;
} }
@ -348,6 +351,16 @@ class _StartSlideshow implements _Event {
final int fileId; final int fileId;
} }
@toString
class _SetAs implements _Event {
const _SetAs(this.fileId);
@override
String toString() => _$toString();
final int fileId;
}
@toString @toString
class _OpenDetailPane implements _Event { class _OpenDetailPane implements _Event {
const _OpenDetailPane(this.shouldAnimate); const _OpenDetailPane(this.shouldAnimate);

View file

@ -23,3 +23,13 @@ class _SlideshowRequest {
final List<FileDescriptor> files; final List<FileDescriptor> files;
final int startIndex; final int startIndex;
} }
class _SetAsRequest {
const _SetAsRequest({
required this.account,
required this.file,
});
final Account account;
final FileDescriptor file;
}