feat: Swipe to next or previous image in image viewer
This commit is contained in:
parent
234998a46e
commit
fb685c03cf
5 changed files with 142 additions and 64 deletions
|
|
@ -10,28 +10,61 @@ import '../../utils/matrix_sdk_extensions/event_extension.dart';
|
|||
|
||||
class ImageViewer extends StatefulWidget {
|
||||
final Event event;
|
||||
final Timeline? timeline;
|
||||
final BuildContext outerContext;
|
||||
|
||||
const ImageViewer(this.event, {required this.outerContext, super.key});
|
||||
const ImageViewer(
|
||||
this.event, {
|
||||
required this.outerContext,
|
||||
this.timeline,
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
ImageViewerController createState() => ImageViewerController();
|
||||
}
|
||||
|
||||
class ImageViewerController extends State<ImageViewer> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
allEvents = widget.timeline?.events
|
||||
.where((event) => event.messageType == MessageTypes.Image)
|
||||
.toList()
|
||||
.reversed
|
||||
.toList() ??
|
||||
[widget.event];
|
||||
var index =
|
||||
allEvents.indexWhere((event) => event.eventId == widget.event.eventId);
|
||||
if (index < 0) index = 0;
|
||||
pageController = PageController(initialPage: index);
|
||||
}
|
||||
|
||||
late final PageController pageController;
|
||||
|
||||
late final List<Event> allEvents;
|
||||
|
||||
int get _index => pageController.page?.toInt() ?? 0;
|
||||
|
||||
Event get currentEvent => allEvents[_index];
|
||||
|
||||
bool get canGoNext => _index < allEvents.length - 1;
|
||||
|
||||
bool get canGoBack => _index > 0;
|
||||
|
||||
/// Forward this image to another room.
|
||||
void forwardAction() => showScaffoldDialog(
|
||||
context: context,
|
||||
builder: (context) => ShareScaffoldDialog(
|
||||
items: [ContentShareItem(widget.event.content)],
|
||||
items: [ContentShareItem(currentEvent.content)],
|
||||
),
|
||||
);
|
||||
|
||||
/// Save this file with a system call.
|
||||
void saveFileAction(BuildContext context) => widget.event.saveFile(context);
|
||||
void saveFileAction(BuildContext context) => currentEvent.saveFile(context);
|
||||
|
||||
/// Save this file with a system call.
|
||||
void shareFileAction(BuildContext context) => widget.event.shareFile(context);
|
||||
void shareFileAction(BuildContext context) => currentEvent.shareFile(context);
|
||||
|
||||
static const maxScaleFactor = 1.5;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue