♻️ Improve file viewing experience
This commit is contained in:
86
lib/widgets/content/image_control_overlay.dart
Normal file
86
lib/widgets/content/image_control_overlay.dart
Normal file
@@ -0,0 +1,86 @@
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:gap/gap.dart';
|
||||
import 'package:photo_view/photo_view.dart';
|
||||
import 'package:material_symbols_icons/symbols.dart';
|
||||
|
||||
class ImageControlOverlay extends HookWidget {
|
||||
final PhotoViewController photoViewController;
|
||||
final ValueNotifier<int> rotation;
|
||||
final bool showOriginal;
|
||||
final VoidCallback onToggleQuality;
|
||||
final List<Widget>? extraButtons;
|
||||
final bool showExtraOnLeft;
|
||||
|
||||
const ImageControlOverlay({
|
||||
super.key,
|
||||
required this.photoViewController,
|
||||
required this.rotation,
|
||||
required this.showOriginal,
|
||||
required this.onToggleQuality,
|
||||
this.extraButtons,
|
||||
this.showExtraOnLeft = false,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final shadow = [
|
||||
Shadow(color: Colors.black54, blurRadius: 5.0, offset: Offset(1.0, 1.0)),
|
||||
];
|
||||
|
||||
final controlButtons = [
|
||||
IconButton(
|
||||
icon: Icon(Icons.remove, color: Colors.white, shadows: shadow),
|
||||
onPressed: () {
|
||||
photoViewController.scale = (photoViewController.scale ?? 1) - 0.05;
|
||||
},
|
||||
),
|
||||
IconButton(
|
||||
icon: Icon(Icons.add, color: Colors.white, shadows: shadow),
|
||||
onPressed: () {
|
||||
photoViewController.scale = (photoViewController.scale ?? 1) + 0.05;
|
||||
},
|
||||
),
|
||||
const Gap(8),
|
||||
IconButton(
|
||||
icon: Icon(Icons.rotate_left, color: Colors.white, shadows: shadow),
|
||||
onPressed: () {
|
||||
rotation.value = (rotation.value - 1) % 4;
|
||||
photoViewController.rotation = rotation.value * -math.pi / 2;
|
||||
},
|
||||
),
|
||||
IconButton(
|
||||
icon: Icon(Icons.rotate_right, color: Colors.white, shadows: shadow),
|
||||
onPressed: () {
|
||||
rotation.value = (rotation.value + 1) % 4;
|
||||
photoViewController.rotation = rotation.value * -math.pi / 2;
|
||||
},
|
||||
),
|
||||
];
|
||||
|
||||
return Positioned(
|
||||
bottom: MediaQuery.of(context).padding.bottom + 16,
|
||||
left: 16,
|
||||
right: 16,
|
||||
child: Row(
|
||||
children: showExtraOnLeft
|
||||
? [...?extraButtons, const Spacer(), ...controlButtons]
|
||||
: [
|
||||
...controlButtons,
|
||||
const Spacer(),
|
||||
IconButton(
|
||||
onPressed: onToggleQuality,
|
||||
icon: Icon(
|
||||
showOriginal ? Symbols.hd : Symbols.sd,
|
||||
color: Colors.white,
|
||||
shadows: shadow,
|
||||
),
|
||||
),
|
||||
...?extraButtons,
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user