dartlangeditorflutterflutter-appsflutter-examplesflutter-packageflutter-widgetquillquill-deltaquilljsreactquillrich-textrich-text-editorwysiwygwysiwyg-editor
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
7.5 KiB
189 lines
7.5 KiB
library flutter_quill_extensions; |
|
|
|
import 'package:flutter/foundation.dart' show kIsWeb; |
|
import 'package:flutter_quill/flutter_quill.dart'; |
|
import 'package:meta/meta.dart' show immutable; |
|
|
|
import 'logic/models/config/configurations.dart'; |
|
import 'presentation/embeds/editor/image/image.dart'; |
|
import 'presentation/embeds/editor/image/image_web.dart'; |
|
import 'presentation/embeds/editor/video.dart'; |
|
import 'presentation/embeds/editor/webview.dart'; |
|
import 'presentation/embeds/toolbar/camera_button.dart'; |
|
import 'presentation/embeds/toolbar/formula_button.dart'; |
|
import 'presentation/embeds/toolbar/image_button/image_button.dart'; |
|
import 'presentation/embeds/toolbar/media_button.dart'; |
|
import 'presentation/embeds/toolbar/video_button.dart'; |
|
import 'presentation/models/config/editor/image.dart'; |
|
import 'presentation/models/config/editor/video.dart'; |
|
import 'presentation/models/config/editor/webview.dart'; |
|
import 'presentation/models/config/toolbar/buttons/camera.dart'; |
|
import 'presentation/models/config/toolbar/buttons/formula.dart'; |
|
import 'presentation/models/config/toolbar/buttons/image.dart'; |
|
import 'presentation/models/config/toolbar/buttons/media_button.dart'; |
|
import 'presentation/models/config/toolbar/buttons/video.dart'; |
|
|
|
export '/presentation/models/config/editor/webview.dart'; |
|
export './logic/extensions/controller.dart'; |
|
export 'presentation/embeds/editor/unknown.dart'; |
|
export 'presentation/embeds/embed_types.dart'; |
|
export 'presentation/embeds/toolbar/camera_button.dart'; |
|
export 'presentation/embeds/toolbar/formula_button.dart'; |
|
export 'presentation/embeds/toolbar/image_button/image_button.dart'; |
|
export 'presentation/embeds/toolbar/media_button.dart'; |
|
export 'presentation/embeds/toolbar/utils/image_video_utils.dart'; |
|
export 'presentation/embeds/toolbar/video_button.dart'; |
|
export 'presentation/embeds/utils.dart'; |
|
export 'presentation/models/config/editor/image.dart'; |
|
export 'presentation/models/config/toolbar/buttons/image.dart'; |
|
|
|
@immutable |
|
class FlutterQuillEmbeds { |
|
const FlutterQuillEmbeds._(); |
|
|
|
/// Returns a list of embed builders for QuillEditor. |
|
/// |
|
/// This method provides a collection of embed builders to enhance the |
|
/// functionality |
|
/// of a QuillEditor. It offers customization options for |
|
/// handling various types of |
|
/// embedded content, such as images, videos, and formulas. |
|
/// |
|
/// **Note:** This method is not intended for web usage. |
|
/// For web-specific embeds, |
|
/// use [editorsWebBuilders]. |
|
/// |
|
/// |
|
/// The method returns a list of [EmbedBuilder] objects that can be used with |
|
/// QuillEditor |
|
/// to enable embedded content features like images, videos, and formulas. |
|
/// |
|
/// |
|
/// final quillEditor = QuillEditor( |
|
/// // Other editor configurations |
|
/// embedBuilders: embedBuilders, |
|
/// ); |
|
/// ``` |
|
/// |
|
/// if you don't want image embed in your quill editor then please pass null |
|
/// to [imageEmbedConfigurations]. same apply to [videoEmbedConfigurations] |
|
static List<EmbedBuilder> editorBuilders({ |
|
QuillEditorImageEmbedConfigurations? imageEmbedConfigurations = |
|
const QuillEditorImageEmbedConfigurations(), |
|
QuillEditorVideoEmbedConfigurations? videoEmbedConfigurations = |
|
const QuillEditorVideoEmbedConfigurations(), |
|
QuillEditorWebViewEmbedConfigurations? webViewEmbedConfigurations = |
|
const QuillEditorWebViewEmbedConfigurations(), |
|
}) { |
|
if (kIsWeb) { |
|
throw UnsupportedError( |
|
'The editorBuilders() is not for web, please use editorBuilders() ' |
|
'instead', |
|
); |
|
} |
|
return [ |
|
if (imageEmbedConfigurations != null) |
|
QuillEditorImageEmbedBuilder( |
|
configurations: imageEmbedConfigurations, |
|
), |
|
if (videoEmbedConfigurations != null) |
|
QuillEditorVideoEmbedBuilder( |
|
configurations: videoEmbedConfigurations, |
|
), |
|
const QuillEditorFormulaEmbedBuilder(), |
|
if (webViewEmbedConfigurations != null) |
|
QuillEditorWebViewEmbedBuilder( |
|
configurations: webViewEmbedConfigurations, |
|
) |
|
]; |
|
} |
|
|
|
/// Returns a list of embed builders specifically designed for web support. |
|
/// |
|
/// [ImageEmbedBuilderWeb] is the embed builder for handling |
|
/// images on the web. |
|
/// |
|
static List<EmbedBuilder> editorsWebBuilders({ |
|
QuillSharedExtensionsConfigurations sharedExtensionsConfigurations = |
|
const QuillSharedExtensionsConfigurations(), |
|
QuillEditorWebImageEmbedConfigurations? imageEmbedConfigurations = |
|
const QuillEditorWebImageEmbedConfigurations(), |
|
}) { |
|
if (!kIsWeb) { |
|
throw UnsupportedError( |
|
'The editorsWebBuilders() is only for web, please use editorBuilders() ' |
|
'instead', |
|
); |
|
} |
|
return [ |
|
if (imageEmbedConfigurations != null) const ImageEmbedBuilderWeb(), |
|
]; |
|
} |
|
|
|
/// Returns a list of embed button builders to customize the toolbar buttons. |
|
/// |
|
/// If you don't want to show one of the buttons for soem reason, |
|
/// pass null to the options of it |
|
/// |
|
/// Example of customizing media pick settings for the image button: |
|
/// ```dart |
|
/// mediaPickSettingSelector: (context) async { |
|
/// final mediaPickSetting = await showModalBottomSheet<MediaPickSetting>( |
|
/// showDragHandle: true, |
|
/// context: context, |
|
/// constraints: const BoxConstraints(maxWidth: 640), |
|
/// builder: (context) => const SelectImageSourceDialog(), |
|
/// ); |
|
/// if (mediaPickSetting == null) { |
|
/// return null; |
|
/// } |
|
/// return mediaPickSetting; |
|
/// } |
|
/// ``` |
|
/// |
|
/// |
|
/// The returned list contains embed button builders for the Quill toolbar. |
|
/// the [formulaButtonOptions] will be disabled by default on web |
|
static List<EmbedButtonBuilder> toolbarButtons({ |
|
QuillToolbarImageButtonOptions? imageButtonOptions = |
|
const QuillToolbarImageButtonOptions(), |
|
QuillToolbarVideoButtonOptions? videoButtonOptions = |
|
const QuillToolbarVideoButtonOptions(), |
|
QuillToolbarFormulaButtonOptions? formulaButtonOptions = |
|
const QuillToolbarFormulaButtonOptions(), |
|
QuillToolbarCameraButtonOptions? cameraButtonOptions, |
|
QuillToolbarMediaButtonOptions? mediaButtonOptions, |
|
}) => |
|
[ |
|
if (imageButtonOptions != null) |
|
(controller, toolbarIconSize, iconTheme, dialogTheme) => |
|
QuillToolbarImageButton( |
|
controller: imageButtonOptions.controller ?? controller, |
|
options: imageButtonOptions, |
|
), |
|
if (videoButtonOptions != null) |
|
(controller, toolbarIconSize, iconTheme, dialogTheme) => |
|
QuillToolbarVideoButton( |
|
controller: videoButtonOptions.controller ?? controller, |
|
options: videoButtonOptions, |
|
), |
|
if (cameraButtonOptions != null) |
|
(controller, toolbarIconSize, iconTheme, dialogTheme) => |
|
QuillToolbarCameraButton( |
|
controller: cameraButtonOptions.controller ?? controller, |
|
options: cameraButtonOptions, |
|
), |
|
if (mediaButtonOptions != null) |
|
(controller, toolbarIconSize, iconTheme, dialogTheme) => |
|
QuillToolbarMediaButton( |
|
controller: mediaButtonOptions.controller ?? controller, |
|
options: mediaButtonOptions, |
|
), |
|
if (formulaButtonOptions != null && !kIsWeb) |
|
(controller, toolbarIconSize, iconTheme, dialogTheme) => |
|
QuillToolbarFormulaButton( |
|
controller: formulaButtonOptions.controller ?? controller, |
|
options: formulaButtonOptions, |
|
), |
|
]; |
|
}
|
|
|