import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:smtias_capture/models/preview_region.dart';
import 'package:smtias_capture/widgets/oriented_preview.dart';
import 'package:smtias_capture/widgets/region_crop.dart';
/// カメラのライブプレビューを表示するウィジェット.
///
/// [region] が指定された場合,**表示向きを適用したプレビューの画面座標**
/// (0.0–1.0)で矩形にクロップして拡大表示する(WYSIWYG / [RegionCrop]).
/// 撮影画像の出力には影響しない.
class CameraPreviewWidget extends StatelessWidget {
const CameraPreviewWidget({
super.key,
required this.controller,
this.region = PreviewRegion.full,
});
final CameraController controller;
/// プレビュー表示のクロップ領域(表示後の画面座標 0.0–1.0).
final PreviewRegion region;
@override
Widget build(BuildContext context) {
if (!controller.value.isInitialized) {
return const Center(child: CircularProgressIndicator());
}
final previewSize = controller.value.previewSize;
if (previewSize == null) {
return const Center(child: CircularProgressIndicator());
}
// カメラのアスペクト比(プレビューは横長で返るので反転)
final cameraAspect = previewSize.height / previewSize.width;
// 表示向きを適用したフルプレビュー(撮影者が見る向き=クロップ元).
final oriented = OrientedPreview(
child: Center(
child: AspectRatio(
aspectRatio: cameraAspect,
child: CameraPreview(controller),
),
),
);
return RegionCrop(region: region, child: oriented);
}
}