Files
App/lib/widgets/content/image_control_overlay.dart
2025-12-28 15:32:00 +08:00

87 lines
2.5 KiB
Dart

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,
],
),
);
}
}