export screenshot

This commit is contained in:
Fabian Freund
2026-05-02 05:58:56 +02:00
parent 063decd451
commit e4853281f1
3 changed files with 88 additions and 0 deletions
@@ -1650,6 +1650,42 @@ class _ExportExpansion extends ConsumerWidget {
},
),
// Export as PNG
_buildSubTile(
'Export as PNG',
icon: MdiIcons.fileImage,
onTap: () async {
final screenshot = await ref
.read(selectedTabSessionProvider)
.requestScreenshot();
final ts = ref.read(tabStateProvider(selectedTabId))!;
if (screenshot != null) {
ui.decodeImageFromList(screenshot, (result) async {
try {
final png = await result.toByteData(
format: ui.ImageByteFormat.png,
);
if (png != null) {
await FilePicker.saveFile(
fileName: '${ts.titleOrAuthority}.png',
type: FileType.custom,
allowedExtensions: ['png'],
bytes: png.buffer.asUint8List(),
);
}
} finally {
result.dispose();
}
});
}
if (context.mounted) Navigator.pop(context);
},
),
// Print
_buildSubTile(
'Print',
@@ -19,6 +19,7 @@
*/
import 'dart:ui' as ui;
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
@@ -260,6 +261,56 @@ class ShareScreenshotMenuItemButton extends HookConsumerWidget {
}
}
class ExportScreenshotMenuItemButton extends HookConsumerWidget {
const ExportScreenshotMenuItemButton({
super.key,
required this.selectedTabId,
});
final String? selectedTabId;
@override
Widget build(BuildContext context, WidgetRef ref) {
return MenuItemButton(
leadingIcon: const Icon(MdiIcons.fileImage),
closeOnActivate: false,
child: const Text('Export as PNG'),
onPressed: () async {
final screenshot = await ref
.read(selectedTabSessionProvider)
.requestScreenshot();
final tabState = ref.read(tabStateProvider(selectedTabId))!;
if (screenshot != null) {
ui.decodeImageFromList(screenshot, (result) async {
try {
final png = await result.toByteData(
format: ui.ImageByteFormat.png,
);
if (png != null) {
await FilePicker.saveFile(
fileName: '${tabState.titleOrAuthority}.png',
type: FileType.custom,
allowedExtensions: ['png'],
bytes: png.buffer.asUint8List(),
);
}
} finally {
result.dispose();
}
});
}
if (context.mounted) {
MenuController.maybeOf(context)?.close();
}
},
);
}
}
class OpenInAppMenuItemButton extends HookConsumerWidget {
const OpenInAppMenuItemButton({super.key, required this.selectedTabId});
@@ -586,6 +586,7 @@ class TabMenu extends HookConsumerWidget {
},
),
SaveToPdfMenuItemButton(selectedTabId: selectedTabId),
ExportScreenshotMenuItemButton(selectedTabId: selectedTabId),
PrintMenuItemButton(selectedTabId: selectedTabId),
],
leadingIcon: const Icon(MdiIcons.fileExport),