pull/1566/head
Ellet 1 year ago
parent 1705bff43e
commit ec2d28c1bc
No known key found for this signature in database
GPG Key ID: C488CC70BBCEF0D1
  1. 3
      CHANGELOG.md
  2. 8
      example/lib/presentation/quill/quill_editor.dart
  3. 9
      example/lib/presentation/quill/quill_screen.dart
  4. 6
      example/lib/presentation/quill/quill_toolbar.dart
  5. 1
      example/lib/presentation/simple/simple_screen.dart
  6. 12
      flutter_quill_extensions/README.md
  7. 4
      flutter_quill_extensions/lib/embeds/image/editor/image_embed.dart
  8. 2
      flutter_quill_extensions/lib/embeds/image/editor/image_menu.dart
  9. 2
      flutter_quill_extensions/lib/embeds/image/toolbar/image_button.dart
  10. 2
      flutter_quill_extensions/lib/embeds/others/camera_button/camera_button.dart
  11. 2
      flutter_quill_extensions/lib/embeds/video/toolbar/video_button.dart
  12. 53
      flutter_quill_extensions/lib/models/config/shared_configurations.dart
  13. 2
      lib/src/extensions/quill_controller_ext.dart
  14. 8
      lib/src/models/config/editor/editor_configurations.dart
  15. 4
      lib/src/models/config/quill_shared_configurations.dart
  16. 3
      lib/src/models/config/toolbar/buttons/base_configurations.dart
  17. 6
      lib/src/models/config/toolbar/toolbar_configurations.dart
  18. 9
      lib/src/widgets/toolbar/base_toolbar.dart
  19. 2
      lib/src/widgets/toolbar/simple_toolbar.dart
  20. 6
      lib/src/widgets/utils/provider.dart

@ -2,6 +2,9 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## 9.0.0-dev-6
* Move the `child` from `QuillToolbarConfigurations` into `QuillToolbar` directly
## 9.0.0-dev-5 ## 9.0.0-dev-5
* The `QuillToolbar` is now accepting only `child` with no configurations so you can customize everything you wants, the `QuillToolbar.simple()` or `QuillSimpleToolbar` implements a simple toolbar that is based on `QuillToolbar`, you are free to use it but it just an example and not standard * The `QuillToolbar` is now accepting only `child` with no configurations so you can customize everything you wants, the `QuillToolbar.simple()` or `QuillSimpleToolbar` implements a simple toolbar that is based on `QuillToolbar`, you are free to use it but it just an example and not standard
* Flutter Quill Extensions: * Flutter Quill Extensions:

@ -33,6 +33,12 @@ class MyQuillEditor extends StatelessWidget {
scrollController: scrollController, scrollController: scrollController,
focusNode: focusNode, focusNode: focusNode,
configurations: configurations.copyWith( configurations: configurations.copyWith(
extraConfigurations: {
QuillEditorExtensionsConfigurations.key:
const QuillEditorExtensionsConfigurations(
assetsPrefix: 'dsadsasda', // Defaults to assets
),
},
customStyles: const DefaultStyles( customStyles: const DefaultStyles(
h1: DefaultTextBlockStyle( h1: DefaultTextBlockStyle(
TextStyle( TextStyle(
@ -99,7 +105,7 @@ class MyQuillEditor extends StatelessWidget {
return getImageProviderByImageSource( return getImageProviderByImageSource(
imageUrl, imageUrl,
imageProviderBuilder: null, imageProviderBuilder: null,
assetsPrefix: QuillSharedExtensionsConfigurations.get( assetsPrefix: QuillEditorExtensionsConfigurations.get(
context: context) context: context)
.assetsPrefix, .assetsPrefix,
); );

@ -3,7 +3,7 @@ import 'dart:convert' show jsonEncode;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/flutter_quill.dart';
import 'package:flutter_quill_extensions/flutter_quill_extensions.dart' import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'
show FlutterQuillEmbeds, QuillSharedExtensionsConfigurations; show FlutterQuillEmbeds;
import 'package:quill_html_converter/quill_html_converter.dart'; import 'package:quill_html_converter/quill_html_converter.dart';
import 'package:share_plus/share_plus.dart' show Share; import 'package:share_plus/share_plus.dart' show Share;
@ -133,12 +133,7 @@ class _QuillScreenState extends State<QuillScreen> {
QuillSharedConfigurations get _sharedConfigurations { QuillSharedConfigurations get _sharedConfigurations {
return const QuillSharedConfigurations( return const QuillSharedConfigurations(
extraConfigurations: { // locale: Locale('en'),
QuillSharedExtensionsConfigurations.key:
QuillSharedExtensionsConfigurations(
assetsPrefix: 'your-assets-folder-name', // Defaults to assets
),
},
); );
} }
} }

@ -100,13 +100,14 @@ class MyQuillToolbar extends StatelessWidget {
// For more info // For more info
// https://github.com/singerdmx/flutter-quill/blob/master/doc/custom_toolbar.md // https://github.com/singerdmx/flutter-quill/blob/master/doc/custom_toolbar.md
return QuillToolbar( return QuillToolbar(
configurations: QuillToolbarConfigurations( configurations: const QuillToolbarConfigurations(
buttonOptions: const QuillToolbarButtonOptions( buttonOptions: QuillToolbarButtonOptions(
base: QuillToolbarBaseButtonOptions( base: QuillToolbarBaseButtonOptions(
globalIconSize: 20, globalIconSize: 20,
globalIconButtonFactor: 1.4, globalIconButtonFactor: 1.4,
), ),
), ),
),
child: SingleChildScrollView( child: SingleChildScrollView(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
child: Row( child: Row(
@ -201,7 +202,6 @@ class MyQuillToolbar extends StatelessWidget {
], ],
), ),
), ),
),
); );
} }
return QuillSimpleToolbar( return QuillSimpleToolbar(

@ -18,6 +18,7 @@ class _SimpleScreenState extends State<SimpleScreen> {
body: Column( body: Column(
children: [ children: [
QuillToolbar.simple( QuillToolbar.simple(
configurations:
QuillSimpleToolbarConfigurations(controller: _controller), QuillSimpleToolbarConfigurations(controller: _controller),
), ),
Expanded( Expanded(

@ -170,18 +170,16 @@ This works for all platforms except Web
If you want to use image assets in the Quill Editor, you need to make sure your assets folder is `assets` otherwise: If you want to use image assets in the Quill Editor, you need to make sure your assets folder is `assets` otherwise:
```dart ```dart
QuillProvider( QuillEditor.basic(
configurations: const QuillConfigurations( configurations: const QuillEditorConfigurations(
sharedConfigurations: QuillSharedConfigurations( // ...
extraConfigurations: { extraConfigurations: {
QuillSharedExtensionsConfigurations.key: QuillEditorExtensionsConfigurations.key:
QuillSharedExtensionsConfigurations( QuillEditorExtensionsConfigurations(
assetsPrefix: 'your-assets-folder-name', // Defaults to assets assetsPrefix: 'your-assets-folder-name', // Defaults to assets
), ),
}, },
), ),
),
child: ...,
) )
``` ```

@ -47,12 +47,12 @@ class QuillEditorImageEmbedBuilder extends EmbedBuilder {
alignment: alignment, alignment: alignment,
height: height, height: height,
width: width, width: width,
assetsPrefix: QuillSharedExtensionsConfigurations.get(context: context) assetsPrefix: QuillEditorExtensionsConfigurations.get(context: context)
.assetsPrefix, .assetsPrefix,
); );
final imageSaverService = final imageSaverService =
QuillSharedExtensionsConfigurations.get(context: context) QuillEditorExtensionsConfigurations.get(context: context)
.imageSaverService; .imageSaverService;
return GestureDetector( return GestureDetector(
onTap: configurations.onImageClicked ?? onTap: configurations.onImageClicked ??

@ -184,7 +184,7 @@ class ImageOptionsMenu extends StatelessWidget {
MaterialPageRoute( MaterialPageRoute(
builder: (_) => ImageTapWrapper( builder: (_) => ImageTapWrapper(
assetsPrefix: assetsPrefix:
QuillSharedExtensionsConfigurations.get(context: context) QuillEditorExtensionsConfigurations.get(context: context)
.assetsPrefix, .assetsPrefix,
imageUrl: imageSource, imageUrl: imageSource,
configurations: configurations, configurations: configurations,

@ -116,7 +116,7 @@ class QuillToolbarImageButton extends StatelessWidget {
Future<void> _onPressedHandler(BuildContext context) async { Future<void> _onPressedHandler(BuildContext context) async {
final imagePickerService = final imagePickerService =
QuillSharedExtensionsConfigurations.get(context: context) QuillEditorExtensionsConfigurations.get(context: context)
.imagePickerService; .imagePickerService;
final onRequestPickImage = final onRequestPickImage =

@ -132,7 +132,7 @@ class QuillToolbarCameraButton extends StatelessWidget {
QuillController controller, QuillController controller,
) async { ) async {
final imagePickerService = final imagePickerService =
QuillSharedExtensionsConfigurations.get(context: context) QuillEditorExtensionsConfigurations.get(context: context)
.imagePickerService; .imagePickerService;
final cameraAction = await _getCameraAction(context); final cameraAction = await _getCameraAction(context);

@ -115,7 +115,7 @@ class QuillToolbarVideoButton extends StatelessWidget {
Future<void> _onPressedHandler(BuildContext context) async { Future<void> _onPressedHandler(BuildContext context) async {
final imagePickerService = final imagePickerService =
QuillSharedExtensionsConfigurations.get(context: context) QuillEditorExtensionsConfigurations.get(context: context)
.imagePickerService; .imagePickerService;
final onRequestPickVideo = options.videoConfigurations.onRequestPickVideo; final onRequestPickVideo = options.videoConfigurations.onRequestPickVideo;

@ -5,37 +5,10 @@ import 'package:meta/meta.dart' show immutable;
import '../../services/image_picker/s_image_picker.dart'; import '../../services/image_picker/s_image_picker.dart';
import '../../services/image_saver/s_image_saver.dart'; import '../../services/image_saver/s_image_saver.dart';
/// Configurations for Flutter Quill Extensions /// Configurations for Flutter Quill Editor Extensions
/// that is shared between the toolbar and editor for the extensions package
///
/// Example on how to setup it:
///
/// ```dart
/// QuillProvider(
/// configurations: QuillConfigurations(
/// sharedConfigurations: const QuillSharedConfigurations(
/// extraConfigurations: {
/// QuillSharedExtensionsConfigurations.key:
/// QuillSharedExtensionsConfigurations(
/// // Feel free to explore it
/// ),
/// },
/// ),
/// controller: _controller,
/// ),
/// child: const Column(
/// children: [
/// // QuillToolbar
/// // QuillEditor
/// // ...
/// ],
// ),
/// )
/// ```
///
@immutable @immutable
class QuillSharedExtensionsConfigurations { class QuillEditorExtensionsConfigurations {
const QuillSharedExtensionsConfigurations({ const QuillEditorExtensionsConfigurations({
ImagePickerService? imagePickerService, ImagePickerService? imagePickerService,
ImageSaverService? imageSaverService, ImageSaverService? imageSaverService,
this.assetsPrefix = 'assets', this.assetsPrefix = 'assets',
@ -44,30 +17,28 @@ class QuillSharedExtensionsConfigurations {
/// Get the instance from the widget tree in [QuillSharedConfigurations] /// Get the instance from the widget tree in [QuillSharedConfigurations]
/// if it doesn't exists, we will create new one with default options /// if it doesn't exists, we will create new one with default options
factory QuillSharedExtensionsConfigurations.get({ factory QuillEditorExtensionsConfigurations.get({
required BuildContext context, required BuildContext context,
}) { }) {
final quillSharedExtensionsConfigurations = final value = context.quillEditorConfigurations?.extraConfigurations[key];
context.quillSharedConfigurations?.extraConfigurations[key]; if (value != null) {
if (quillSharedExtensionsConfigurations != null) { if (value is! QuillEditorExtensionsConfigurations) {
if (quillSharedExtensionsConfigurations
is! QuillSharedExtensionsConfigurations) {
throw ArgumentError( throw ArgumentError(
'The value of key `$key` should be of type ' 'The value of key `$key` should be of type '
'QuillSharedExtensionsConfigurations', '$key',
); );
} }
return quillSharedExtensionsConfigurations; return value;
} }
return const QuillSharedExtensionsConfigurations(); return const QuillEditorExtensionsConfigurations();
} }
/// The key to be used in the `extraConfigurations` property /// The key to be used in the `extraConfigurations` property
/// which can be found in the [QuillSharedConfigurations] /// which can be found in the [QuillSharedConfigurations]
/// which lives in the [QuillConfigurations] /// which lives in the [QuillConfigurations]
/// ///
/// which exists in the [QuillProvider] /// which exists in the [QuillEditorConfigurations]
static const String key = 'quillSharedExtensionsConfigurations'; static const String key = 'QuillEditorExtensionsConfigurations';
/// Defaults to [ImagePickerService.defaultImpl] /// Defaults to [ImagePickerService.defaultImpl]
final ImagePickerService? _imagePickerService; final ImagePickerService? _imagePickerService;

@ -5,7 +5,7 @@ import 'quill_configurations_ext.dart';
extension QuillControllerNullableExt on QuillController? { extension QuillControllerNullableExt on QuillController? {
/// Simple logic to use the current passed controller if not null /// Simple logic to use the current passed controller if not null
/// if null then we will have to use the default one from [QuillProvider] /// if null then we will have to use the default one
/// using the [context] /// using the [context]
QuillController notNull(BuildContext context) { QuillController notNull(BuildContext context) {
final controller = this; final controller = this;

@ -75,10 +75,14 @@ class QuillEditorConfigurations extends Equatable {
this.builder, this.builder,
this.magnifierConfiguration, this.magnifierConfiguration,
this.textInputAction = TextInputAction.newline, this.textInputAction = TextInputAction.newline,
this.extraConfigurations = const {},
}); });
final QuillSharedConfigurations sharedConfigurations; final QuillSharedConfigurations sharedConfigurations;
/// Store custom configurations in here and use it in the widget tree
final Map<String, Object?> extraConfigurations;
final QuillController controller; final QuillController controller;
/// The text placeholder in the quill editor /// The text placeholder in the quill editor
@ -338,6 +342,8 @@ class QuillEditorConfigurations extends Equatable {
// regenerate this function using extension in vs code or plugin in intellij // regenerate this function using extension in vs code or plugin in intellij
QuillEditorConfigurations copyWith({ QuillEditorConfigurations copyWith({
QuillSharedConfigurations? sharedConfigurations,
Map<String, Object?>? extraConfigurations,
QuillController? controller, QuillController? controller,
String? placeholder, String? placeholder,
bool? readOnly, bool? readOnly,
@ -384,6 +390,8 @@ class QuillEditorConfigurations extends Equatable {
TextInputAction? textInputAction, TextInputAction? textInputAction,
}) { }) {
return QuillEditorConfigurations( return QuillEditorConfigurations(
sharedConfigurations: sharedConfigurations ?? this.sharedConfigurations,
extraConfigurations: extraConfigurations ?? this.extraConfigurations,
controller: controller ?? this.controller, controller: controller ?? this.controller,
placeholder: placeholder ?? this.placeholder, placeholder: placeholder ?? this.placeholder,
readOnly: readOnly ?? this.readOnly, readOnly: readOnly ?? this.readOnly,

@ -15,7 +15,6 @@ class QuillSharedConfigurations extends Equatable {
this.dialogBarrierColor = Colors.black54, this.dialogBarrierColor = Colors.black54,
this.dialogTheme, this.dialogTheme,
this.locale, this.locale,
this.extraConfigurations = const {},
}); });
// This is just example or showcase of this major update to make the library // This is just example or showcase of this major update to make the library
@ -34,9 +33,6 @@ class QuillSharedConfigurations extends Equatable {
/// `MaterialApp` or `WidgetsApp` /// `MaterialApp` or `WidgetsApp`
final Locale? locale; final Locale? locale;
/// Store custom configurations in here and use it in the widget tree
final Map<String, Object?> extraConfigurations;
@override @override
List<Object?> get props => [ List<Object?> get props => [
dialogBarrierColor, dialogBarrierColor,

@ -1,4 +1,3 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart' show VoidCallback, immutable; import 'package:flutter/foundation.dart' show VoidCallback, immutable;
import 'package:flutter/widgets.dart' show BuildContext, IconData, Widget; import 'package:flutter/widgets.dart' show BuildContext, IconData, Widget;
@ -82,7 +81,7 @@ class QuillToolbarBaseButtonOptions<T, I> extends Equatable {
/// If you want to dispaly a differnet widget based using a builder /// If you want to dispaly a differnet widget based using a builder
final QuillToolbarButtonOptionsChildBuilder<T, I> childBuilder; final QuillToolbarButtonOptionsChildBuilder<T, I> childBuilder;
/// By default it will be from the one in [QuillProvider] /// By default it will be from the one in [QuillEditor] or [QuillToolbar]
/// To override it you must pass not null controller /// To override it you must pass not null controller
/// if you wish to use the controller in the [childBuilder], please use the /// if you wish to use the controller in the [childBuilder], please use the
/// one from the extraOptions since it will be not null and will be the one /// one from the extraOptions since it will be not null and will be the one

@ -1,5 +1,4 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first import 'package:flutter/widgets.dart' show immutable;
import 'package:flutter/widgets.dart' show Widget, immutable;
import '../../../widgets/toolbar/base_toolbar.dart'; import '../../../widgets/toolbar/base_toolbar.dart';
import 'toolbar_shared_configurations.dart'; import 'toolbar_shared_configurations.dart';
@ -7,7 +6,6 @@ import 'toolbar_shared_configurations.dart';
@immutable @immutable
class QuillToolbarConfigurations extends QuillSharedToolbarProperties { class QuillToolbarConfigurations extends QuillSharedToolbarProperties {
const QuillToolbarConfigurations({ const QuillToolbarConfigurations({
required this.child,
super.sharedConfigurations, super.sharedConfigurations,
/// Note this only used when you using the quill toolbar buttons like /// Note this only used when you using the quill toolbar buttons like
@ -15,8 +13,6 @@ class QuillToolbarConfigurations extends QuillSharedToolbarProperties {
super.buttonOptions = const QuillToolbarButtonOptions(), super.buttonOptions = const QuillToolbarButtonOptions(),
}); });
final Widget child;
@override @override
List<Object?> get props => []; List<Object?> get props => [];
} }

@ -30,17 +30,20 @@ typedef QuillBaseToolbarChildrenBuilder = List<Widget> Function(
class QuillToolbar extends StatelessWidget implements PreferredSizeWidget { class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
const QuillToolbar({ const QuillToolbar({
required this.configurations, required this.child,
this.configurations = const QuillToolbarConfigurations(),
super.key, super.key,
}); });
static QuillSimpleToolbar simple( static QuillSimpleToolbar simple(
QuillSimpleToolbarConfigurations configurations) { {required QuillSimpleToolbarConfigurations configurations}) {
return QuillSimpleToolbar( return QuillSimpleToolbar(
configurations: configurations, configurations: configurations,
); );
} }
final Widget child;
final QuillToolbarConfigurations configurations; final QuillToolbarConfigurations configurations;
// We can't get the modified [toolbarSize] by the developer // We can't get the modified [toolbarSize] by the developer
@ -57,7 +60,7 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
return FlutterQuillLocalizationsWidget( return FlutterQuillLocalizationsWidget(
child: QuillToolbarProvider( child: QuillToolbarProvider(
toolbarConfigurations: configurations, toolbarConfigurations: configurations,
child: configurations.child, child: child,
), ),
); );
} }

@ -428,6 +428,7 @@ class QuillSimpleToolbar extends StatelessWidget
child: QuillToolbar( child: QuillToolbar(
configurations: QuillToolbarConfigurations( configurations: QuillToolbarConfigurations(
buttonOptions: configurations.buttonOptions, buttonOptions: configurations.buttonOptions,
),
child: Builder( child: Builder(
builder: (context) { builder: (context) {
if (configurations.multiRowsDisplay) { if (configurations.multiRowsDisplay) {
@ -462,7 +463,6 @@ class QuillSimpleToolbar extends StatelessWidget
}, },
), ),
), ),
),
); );
} }

@ -44,7 +44,7 @@ class QuillSimpleToolbarProvider extends InheritedWidget {
'You might using QuillToolbar so make sure to' 'You might using QuillToolbar so make sure to'
' wrap them with the quill provider widget and setup the required ' ' wrap them with the quill provider widget and setup the required '
'configurations', 'configurations',
'QuillProvider', 'QuillSimpleToolbarProvider',
); );
} }
return provider; return provider;
@ -102,7 +102,7 @@ class QuillToolbarProvider extends InheritedWidget {
'You might using QuillBaseToolbar so make sure to' 'You might using QuillBaseToolbar so make sure to'
' wrap them with the quill provider widget and setup the required ' ' wrap them with the quill provider widget and setup the required '
'configurations', 'configurations',
'QuillProvider', 'QuillToolbarProvider',
); );
} }
return provider; return provider;
@ -159,7 +159,7 @@ class QuillEditorProvider extends InheritedWidget {
'You might using QuillEditor so make sure to' 'You might using QuillEditor so make sure to'
' wrap them with the quill provider widget and setup the required ' ' wrap them with the quill provider widget and setup the required '
'configurations', 'configurations',
'QuillProvider', 'QuillEditorProvider',
); );
} }
return provider; return provider;

Loading…
Cancel
Save