147 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
| import 'package:flutter/widgets.dart';
 | |
| 
 | |
| import 'package:file_picker/file_picker.dart';
 | |
| import 'package:file_selector/file_selector.dart';
 | |
| 
 | |
| import 'package:extera_next/utils/platform_infos.dart';
 | |
| import 'package:extera_next/widgets/app_lock.dart';
 | |
| import 'package:extera_next/widgets/future_loading_dialog.dart';
 | |
| 
 | |
| Future<List<XFile>> selectFiles(
 | |
|   BuildContext context, {
 | |
|   String? title,
 | |
|   FileSelectorType type = FileSelectorType.any,
 | |
|   bool allowMultiple = false,
 | |
| }) async {
 | |
|   if (!PlatformInfos.isLinux) {
 | |
|     final result = await AppLock.of(context).pauseWhile(
 | |
|       showFutureLoadingDialog(
 | |
|         context: context,
 | |
|         future: () => FilePicker.platform.pickFiles(
 | |
|           compressionQuality: 0,
 | |
|           allowMultiple: allowMultiple,
 | |
|           type: type.filePickerType,
 | |
|           allowedExtensions: type.extensions,
 | |
|         ),
 | |
|       ),
 | |
|     );
 | |
|     return result.result?.xFiles ?? [];
 | |
|   }
 | |
| 
 | |
|   if (allowMultiple) {
 | |
|     return await AppLock.of(context).pauseWhile(
 | |
|       openFiles(
 | |
|         confirmButtonText: title,
 | |
|         acceptedTypeGroups: type.groups,
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
|   final file = await AppLock.of(context).pauseWhile(
 | |
|     openFile(
 | |
|       confirmButtonText: title,
 | |
|       acceptedTypeGroups: type.groups,
 | |
|     ),
 | |
|   );
 | |
|   if (file == null) return [];
 | |
|   return [file];
 | |
| }
 | |
| 
 | |
| enum FileSelectorType {
 | |
|   any([], FileType.any, null),
 | |
|   images(
 | |
|     [
 | |
|       XTypeGroup(
 | |
|         label: 'JPG',
 | |
|         extensions: <String>['jpg', 'JPG', 'jpeg', 'JPEG'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'PNGs',
 | |
|         extensions: <String>['png', 'PNG'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'WEBP',
 | |
|         extensions: <String>['WebP', 'WEBP'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'GIF',
 | |
|         extensions: <String>['gif', 'GIF'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'BMP',
 | |
|         extensions: <String>['bmp', 'BMP'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'TIFF',
 | |
|         extensions: <String>['tiff', 'TIFF', 'tif', 'TIF'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'HEIC',
 | |
|         extensions: <String>['heic', 'HEIC'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'SVG',
 | |
|         extensions: <String>['svg', 'SVG'],
 | |
|       ),
 | |
|     ],
 | |
|     FileType.image,
 | |
|     null,
 | |
|   ),
 | |
|   videos(
 | |
|     [
 | |
|       XTypeGroup(
 | |
|         label: 'MP4',
 | |
|         extensions: <String>['mp4', 'MP4'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'AVI',
 | |
|         extensions: <String>['avi', 'AVI'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'MOV',
 | |
|         extensions: <String>['mov', 'MOV'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'MKV',
 | |
|         extensions: <String>['mkv', 'MKV'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'WMV',
 | |
|         extensions: <String>['wmv', 'WMV'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'FLV',
 | |
|         extensions: <String>['flv', 'FLV'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'MPEG',
 | |
|         extensions: <String>['mpeg', 'MPEG'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: '3GP',
 | |
|         extensions: <String>['3gp', '3GP'],
 | |
|       ),
 | |
|       XTypeGroup(
 | |
|         label: 'OGG',
 | |
|         extensions: <String>['ogg', 'OGG'],
 | |
|       ),
 | |
|     ],
 | |
|     FileType.video,
 | |
|     null,
 | |
|   ),
 | |
|   zip(
 | |
|     [
 | |
|       XTypeGroup(
 | |
|         label: 'ZIP',
 | |
|         extensions: <String>['zip', 'ZIP'],
 | |
|       ),
 | |
|     ],
 | |
|     FileType.custom,
 | |
|     ['zip', 'ZIP'],
 | |
|   );
 | |
| 
 | |
|   const FileSelectorType(this.groups, this.filePickerType, this.extensions);
 | |
|   final List<XTypeGroup> groups;
 | |
|   final FileType filePickerType;
 | |
|   final List<String>? extensions;
 | |
| }
 |