From 114443fb57914d388972b15a22e48e8451e59573 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 22 Dec 2022 16:18:33 +0100 Subject: [PATCH] feat: added icon support --- example/lib/media_picker.dart | 1 + lib/flutter_media_picker.dart | 1 + lib/src/abstracts/media_picker_input.dart | 7 ++- lib/src/enums/button_type.dart | 4 ++ lib/src/enums/enums.dart | 1 + lib/src/inputs/input_audio.dart | 4 ++ lib/src/inputs/input_file.dart | 6 +- lib/src/inputs/input_photo.dart | 4 ++ lib/src/inputs/input_text.dart | 4 ++ lib/src/inputs/input_video.dart | 4 ++ lib/src/media_picker.dart | 77 +++++++++++++++-------- 11 files changed, 84 insertions(+), 29 deletions(-) create mode 100644 lib/src/enums/button_type.dart create mode 100644 lib/src/enums/enums.dart diff --git a/example/lib/media_picker.dart b/example/lib/media_picker.dart index d13f061..a8b7076 100644 --- a/example/lib/media_picker.dart +++ b/example/lib/media_picker.dart @@ -59,6 +59,7 @@ class _MediaPickerState extends ConsumerState { height: 15, ), MediaPicker( + buttonType: ButtonType.icons, mediaPickerInputs: [ MediaPickerInputPhoto( pickFile: mediaService.pickImageFile, diff --git a/lib/flutter_media_picker.dart b/lib/flutter_media_picker.dart index b08d9cb..2d0d81b 100644 --- a/lib/flutter_media_picker.dart +++ b/lib/flutter_media_picker.dart @@ -9,6 +9,7 @@ export './src/inputs/inputs.dart'; export './src/service/services.dart'; export './src/media_result.dart'; export './src/media_picker.dart'; +export './src/enums/enums.dart'; import 'package:flutter_media_picker/flutter_media_picker.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; diff --git a/lib/src/abstracts/media_picker_input.dart b/lib/src/abstracts/media_picker_input.dart index 66097b8..966231d 100644 --- a/lib/src/abstracts/media_picker_input.dart +++ b/lib/src/abstracts/media_picker_input.dart @@ -3,11 +3,14 @@ // SPDX-License-Identifier: BSD-3-Clause import 'package:flutter/material.dart'; +import 'package:flutter_media_picker/src/enums/button_type.dart'; import 'package:flutter_media_picker/src/media_result.dart'; /// Abstract class for inputs used by [MediaPicker]. /// -/// The [label] is used as the title in the header. +/// The [label] is used as the title in the header and under the icon, based on which [ButtonType] you chose. +/// +/// The [icon] is used as the icon in the iconButton if [ButtonType] is icon. /// /// [onPressed] is called when the user has chosen the input to use. /// @@ -21,6 +24,8 @@ import 'package:flutter_media_picker/src/media_result.dart'; abstract class MediaPickerInput { String label = "Media Picker input"; + Widget icon = const Icon(Icons.image); + Future onPressed(BuildContext context); Future displayResult(MediaResult result); diff --git a/lib/src/enums/button_type.dart b/lib/src/enums/button_type.dart new file mode 100644 index 0000000..7ff9b2d --- /dev/null +++ b/lib/src/enums/button_type.dart @@ -0,0 +1,4 @@ +enum ButtonType { + icons, + text, +} \ No newline at end of file diff --git a/lib/src/enums/enums.dart b/lib/src/enums/enums.dart new file mode 100644 index 0000000..1323fb9 --- /dev/null +++ b/lib/src/enums/enums.dart @@ -0,0 +1 @@ +export 'button_type.dart'; diff --git a/lib/src/inputs/input_audio.dart b/lib/src/inputs/input_audio.dart index d8e6449..3a6b227 100644 --- a/lib/src/inputs/input_audio.dart +++ b/lib/src/inputs/input_audio.dart @@ -16,6 +16,7 @@ import 'package:intl/intl.dart'; class MediaPickerInputAudio implements MediaPickerInput { MediaPickerInputAudio({ this.label = "Audio", + this.icon = const Icon(Icons.audio_file), this.checkPageSettings, this.onComplete, required this.audioService, @@ -29,6 +30,9 @@ class MediaPickerInputAudio implements MediaPickerInput { @override String label; + @override + Widget icon; + @override Future onPressed(BuildContext context) async { MediaResult audio = MediaResult(); diff --git a/lib/src/inputs/input_file.dart b/lib/src/inputs/input_file.dart index 36bcbd6..abfb69e 100644 --- a/lib/src/inputs/input_file.dart +++ b/lib/src/inputs/input_file.dart @@ -16,6 +16,7 @@ import '../../flutter_media_picker.dart'; class MediaPickerInputFile implements MediaPickerInput { MediaPickerInputFile({ this.label = "File", + this.icon = const Icon(Icons.file_copy), this.fileExtensions = const ['pdf', 'jpg', 'png'], this.checkPageSettings, this.onComplete, @@ -28,6 +29,9 @@ class MediaPickerInputFile implements MediaPickerInput { @override String label; + @override + Widget icon; + @override Future onPressed(BuildContext context) async { var file = await pickFile?.call(fileExtensions); @@ -64,7 +68,7 @@ class MediaPickerInputFile implements MediaPickerInput { case '.txt': return const DisplayText(); default: -} + } } return Container(); diff --git a/lib/src/inputs/input_photo.dart b/lib/src/inputs/input_photo.dart index 59e5da4..7179fe5 100644 --- a/lib/src/inputs/input_photo.dart +++ b/lib/src/inputs/input_photo.dart @@ -13,6 +13,7 @@ import 'package:flutter_media_picker/src/media_result.dart'; class MediaPickerInputPhoto implements MediaPickerInput { MediaPickerInputPhoto({ this.label = "Photo", + this.icon = const Icon(Icons.image), this.checkPageSettings, this.onComplete, this.pickFile, @@ -23,6 +24,9 @@ class MediaPickerInputPhoto implements MediaPickerInput { @override String label; + @override + Widget icon; + @override Future onPressed(BuildContext context) async { var image = await pickFile?.call(); diff --git a/lib/src/inputs/input_text.dart b/lib/src/inputs/input_text.dart index 6ccca41..01d86fe 100644 --- a/lib/src/inputs/input_text.dart +++ b/lib/src/inputs/input_text.dart @@ -12,6 +12,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; class MediaPickerInputText implements MediaPickerInput { MediaPickerInputText({ this.label = "Text", + this.icon = const Icon(Icons.text_fields), this.checkPageSettings, this.onComplete, }); @@ -19,6 +20,9 @@ class MediaPickerInputText implements MediaPickerInput { @override String label; + @override + Widget icon; + @override Future onPressed(BuildContext context) async { return MediaResult(); diff --git a/lib/src/inputs/input_video.dart b/lib/src/inputs/input_video.dart index 3f16c17..1d3d8a5 100644 --- a/lib/src/inputs/input_video.dart +++ b/lib/src/inputs/input_video.dart @@ -11,6 +11,7 @@ import 'package:flutter_media_picker/flutter_media_picker.dart'; class MediaPickerInputVideo implements MediaPickerInput { MediaPickerInputVideo({ this.label = "Video", + this.icon = const Icon(Icons.video_camera_front), this.checkPageSettings, this.onComplete, this.pickFile, @@ -23,6 +24,9 @@ class MediaPickerInputVideo implements MediaPickerInput { @override String label; + @override + Widget icon; + @override Future onPressed(BuildContext context) async { var image = await pickFile?.call(); diff --git a/lib/src/media_picker.dart b/lib/src/media_picker.dart index 466957c..0430a33 100644 --- a/lib/src/media_picker.dart +++ b/lib/src/media_picker.dart @@ -104,14 +104,19 @@ class MediaPicker extends ConsumerWidget { const MediaPicker({ this.mediaPickerInputs, this.header, + this.iconButton, this.onComplete, this.mediaCheckPage, + this.buttonType = ButtonType.text, Key? key, }) : super(key: key); final List? mediaPickerInputs; final Widget Function(String label, Function onPressed)? header; + final Widget Function(String label, Widget icon, Function onPressed)? + iconButton; final void Function(MediaResult result)? onComplete; + final ButtonType buttonType; final Widget Function( Widget displayResult, Map? inputSettings, @@ -136,40 +141,58 @@ class MediaPicker extends ConsumerWidget { return Column( children: [ - for (final input in inputs) ...[ - const SizedBox(height: 2.5), - header?.call(input.label, (BuildContext ct) async { - await onPressedMediaType(ct, input); - }) ?? - GestureDetector( - onTap: () async { - await onPressedMediaType(context, input); - }, - child: Container( - height: 55, - width: MediaQuery.of(context).size.width * 0.9, - decoration: const BoxDecoration( - border: Border( - bottom: BorderSide( - color: Color(0xFF979797), - width: 1, + if (buttonType == ButtonType.text) ...[ + for (final input in inputs) ...[ + const SizedBox(height: 2.5), + header?.call(input.label, (BuildContext ct) async { + await onPressedMediaType(ct, input); + }) ?? + GestureDetector( + onTap: () async { + await onPressedMediaType(context, input); + }, + child: Container( + height: 55, + width: MediaQuery.of(context).size.width * 0.9, + decoration: const BoxDecoration( + border: Border( + bottom: BorderSide( + color: Color(0xFF979797), + width: 1, + ), ), ), - ), - child: Align( - alignment: Alignment.centerLeft, - child: Padding( - padding: const EdgeInsets.only(left: 15), - child: Text( - input.label, - style: Theme.of(context).textTheme.headline6, + child: Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.only(left: 15), + child: Text( + input.label, + style: Theme.of(context).textTheme.headline6, + ), ), ), ), ), + const SizedBox(height: 2.5), + ], + ] else ...[ + for (final input in inputs) ...[ + iconButton?.call(input.label, input.icon, (BuildContext ct) async { + await onPressedMediaType(ct, input); + }) ?? GestureDetector( + onTap: () async { + await onPressedMediaType(context, input); + }, + child: Column( + children: [ + input.icon, + Text(input.label), + ], ), - const SizedBox(height: 2.5), - ], + ) + ], + ] ], ); }