implement saving image, sharing image, reading settings and chapters view

This commit is contained in:
nyne
2024-10-08 16:52:20 +08:00
parent b44998663a
commit 5deb71e10a
15 changed files with 723 additions and 213 deletions

19
lib/utils/file_type.dart Normal file
View File

@@ -0,0 +1,19 @@
import 'dart:typed_data';
import 'package:mime/mime.dart';
class FileType {
final String ext;
final String mime;
const FileType(this.ext, this.mime);
}
FileType detectFileType(List<int> data) {
var mime = lookupMimeType('no-file', headerBytes: data);
var ext = mime == null ? '' : extensionFromMime(mime);
if(ext == 'jpe') {
ext = 'jpg';
}
return FileType(".$ext", mime ?? 'application/octet-stream');
}

View File

@@ -6,14 +6,15 @@ import 'package:flutter/services.dart';
import 'package:venera/foundation/app.dart';
import 'package:venera/utils/ext.dart';
import 'package:path/path.dart' as p;
import 'package:share_plus/share_plus.dart' as s;
export 'dart:io';
class FilePath {
const FilePath._();
static String join(String path1, String path2, [String? path3, String? path4, String? path5]) {
static String join(String path1, String path2,
[String? path3, String? path4, String? path5]) {
return p.join(path1, path2, path3, path4, path5);
}
}
@@ -121,7 +122,7 @@ class DirectoryPicker {
final _methodChannel = const MethodChannel("venera/method_channel");
Future<Directory?> pickDirectory() async {
if(App.isWindows || App.isLinux) {
if (App.isWindows || App.isLinux) {
var d = await FilePicker.platform.getDirectoryPath();
_directory = d;
return d == null ? null : Directory(d);
@@ -138,15 +139,50 @@ class DirectoryPicker {
}
Future<void> dispose() async {
if(_directory == null) {
if (_directory == null) {
return;
}
if(App.isAndroid && _directory != null) {
if (App.isAndroid && _directory != null) {
return Directory(_directory!).deleteIgnoreError(recursive: true);
}
if(App.isIOS || App.isMacOS) {
if (App.isIOS || App.isMacOS) {
await _methodChannel.invokeMethod("stopAccessingSecurityScopedResource");
}
}
}
Future<void> saveFile(
{required Uint8List data, required String filename}) async {
var res = await FilePicker.platform.saveFile(
bytes: data,
fileName: filename,
lockParentWindow: true,
);
if (App.isDesktop && res != null) {
await File(res).writeAsBytes(data);
}
}
class Share {
static void shareFile({
required Uint8List data,
required String filename,
required String mime,
}) {
if (!App.isWindows) {
s.Share.shareXFiles(
[s.XFile.fromData(data, mimeType: mime)],
fileNameOverrides: [filename],
);
} else {
// write to cache
var file = File(FilePath.join(Directory.systemTemp.path, filename));
file.writeAsBytesSync(data);
s.Share.shareXFiles([s.XFile(file.path)]);
}
}
static void shareText(String text) {
s.Share.share(text);
}
}