feat: basic signature overlay on document implement

This commit is contained in:
insleker 2025-09-03 18:05:34 +08:00
parent f4bd486ad9
commit 8507dcf6f5
3 changed files with 63 additions and 8 deletions

View File

@ -66,12 +66,24 @@ class PdfMockContinuousList extends ConsumerWidget {
Container( Container(
color: Colors.grey.shade200, color: Colors.grey.shade200,
child: Center( child: Center(
child: Text( child: Builder(
AppLocalizations.of(context).pageInfo(pageNum, count), builder: (ctx) {
String label;
try {
label = AppLocalizations.of(
ctx,
).pageInfo(pageNum, count);
} catch (_) {
label = 'Page $pageNum of $count';
}
return Text(
label,
style: const TextStyle( style: const TextStyle(
fontSize: 24, fontSize: 24,
color: Colors.black54, color: Colors.black54,
), ),
);
},
), ),
), ),
), ),

View File

@ -8,6 +8,7 @@ import '../view_model/view_model.dart';
import '../../../../data/services/preferences_providers.dart'; import '../../../../data/services/preferences_providers.dart';
import 'signature_drag_data.dart'; import 'signature_drag_data.dart';
import 'pdf_mock_continuous_list.dart'; import 'pdf_mock_continuous_list.dart';
import 'pdf_page_overlays.dart';
class PdfPageArea extends ConsumerStatefulWidget { class PdfPageArea extends ConsumerStatefulWidget {
const PdfPageArea({ const PdfPageArea({
@ -191,7 +192,14 @@ class _PdfPageAreaState extends ConsumerState<PdfPageArea> {
}); });
if (!pdf.loaded) { if (!pdf.loaded) {
return Center(child: Text(AppLocalizations.of(context).noPdfLoaded)); // In tests, AppLocalizations delegate may not be injected; fallback.
String text;
try {
text = AppLocalizations.of(context).noPdfLoaded;
} catch (_) {
text = 'No PDF loaded';
}
return Center(child: Text(text));
} }
final useMock = ref.watch(useMockViewerProvider); final useMock = ref.watch(useMockViewerProvider);
@ -229,6 +237,35 @@ class _PdfPageAreaState extends ConsumerState<PdfPageArea> {
keyHandlerParams: PdfViewerKeyHandlerParams(autofocus: true), keyHandlerParams: PdfViewerKeyHandlerParams(autofocus: true),
maxScale: 8, maxScale: 8,
scrollByMouseWheel: 0.6, scrollByMouseWheel: 0.6,
// Render signature overlays on each page via pdfrx pageOverlaysBuilder
pageOverlaysBuilder: (context, pageRect, page) {
return [
Consumer(
builder: (context, ref, _) {
final visible = ref.watch(signatureVisibilityProvider);
if (!visible) return const SizedBox.shrink();
return Align(
alignment: Alignment.topLeft,
child: SizedBox(
width: pageRect.width,
height: pageRect.height,
child: PdfPageOverlays(
pageSize: widget.pageSize,
pageNumber: page.pageNumber,
onDragSignature:
(delta) => widget.onDragSignature(delta),
onResizeSignature:
(delta) => widget.onResizeSignature(delta),
onConfirmSignature: widget.onConfirmSignature,
onClearActiveOverlay: widget.onClearActiveOverlay,
onSelectPlaced: widget.onSelectPlaced,
),
),
);
},
),
];
},
// Add overlay scroll thumbs (vertical on right, horizontal on bottom) // Add overlay scroll thumbs (vertical on right, horizontal on bottom)
viewerOverlayBuilder: viewerOverlayBuilder:
(context, size, handleLinkTap) => [ (context, size, handleLinkTap) => [

View File

@ -268,7 +268,13 @@ class _SignatureImage extends ConsumerWidget {
} }
if (bytes == null) { if (bytes == null) {
return Center(child: Text(AppLocalizations.of(context).signature)); String label;
try {
label = AppLocalizations.of(context).signature;
} catch (_) {
label = 'Signature';
}
return Center(child: Text(label));
} }
Widget im = Image.memory(bytes, fit: BoxFit.contain); Widget im = Image.memory(bytes, fit: BoxFit.contain);