parent
97375b5262
commit
e30786cd95
33 changed files with 223 additions and 118 deletions
@ -0,0 +1,10 @@ |
|||||||
|
# This file tracks properties of this Flutter project. |
||||||
|
# Used by Flutter tool to assess capabilities and perform upgrades etc. |
||||||
|
# |
||||||
|
# This file should be version controlled and should not be manually edited. |
||||||
|
|
||||||
|
version: |
||||||
|
revision: f1875d570e39de09040c8f79aa13cc56baab8db1 |
||||||
|
channel: stable |
||||||
|
|
||||||
|
project_type: package |
@ -0,0 +1,3 @@ |
|||||||
|
## 0.0.1 |
||||||
|
|
||||||
|
* TODO: Describe initial release. |
@ -0,0 +1 @@ |
|||||||
|
TODO: Add your license here. |
@ -0,0 +1,22 @@ |
|||||||
|
# Flutter Quill Extensions |
||||||
|
|
||||||
|
Helpers to support embed widgets in flutter_quill. |
||||||
|
|
||||||
|
## Usage |
||||||
|
|
||||||
|
Set the `embedBuilders` and `embedToolbar` params in `QuillEditor` and `QuillToolbar` with the |
||||||
|
values provided by this repository. |
||||||
|
|
||||||
|
``` |
||||||
|
QuillEditor.basic( |
||||||
|
controller: controller, |
||||||
|
embedBuilders: FlutterQuillEmbeds.builders, |
||||||
|
); |
||||||
|
``` |
||||||
|
|
||||||
|
``` |
||||||
|
QuillToolbar.basic( |
||||||
|
controller: controller, |
||||||
|
embedToolbar: QuillEmbedToolbar(), |
||||||
|
); |
||||||
|
``` |
@ -0,0 +1,37 @@ |
|||||||
|
include: package:pedantic/analysis_options.yaml |
||||||
|
|
||||||
|
analyzer: |
||||||
|
errors: |
||||||
|
undefined_prefixed_name: ignore |
||||||
|
unsafe_html: ignore |
||||||
|
linter: |
||||||
|
rules: |
||||||
|
- always_declare_return_types |
||||||
|
- always_put_required_named_parameters_first |
||||||
|
- annotate_overrides |
||||||
|
- avoid_empty_else |
||||||
|
- avoid_escaping_inner_quotes |
||||||
|
- avoid_print |
||||||
|
- avoid_redundant_argument_values |
||||||
|
- avoid_types_on_closure_parameters |
||||||
|
- avoid_void_async |
||||||
|
- cascade_invocations |
||||||
|
- directives_ordering |
||||||
|
- lines_longer_than_80_chars |
||||||
|
- omit_local_variable_types |
||||||
|
- prefer_const_constructors |
||||||
|
- prefer_const_constructors_in_immutables |
||||||
|
- prefer_const_declarations |
||||||
|
- prefer_final_fields |
||||||
|
- prefer_final_in_for_each |
||||||
|
- prefer_final_locals |
||||||
|
- prefer_initializing_formals |
||||||
|
- prefer_int_literals |
||||||
|
- prefer_interpolation_to_compose_strings |
||||||
|
- prefer_relative_imports |
||||||
|
- prefer_single_quotes |
||||||
|
- sort_constructors_first |
||||||
|
- sort_unnamed_constructors_first |
||||||
|
- unnecessary_lambdas |
||||||
|
- unnecessary_parenthesis |
||||||
|
- unnecessary_string_interpolations |
@ -1,23 +1,20 @@ |
|||||||
import 'package:flutter/material.dart'; |
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_quill/flutter_quill.dart'; |
||||||
|
|
||||||
import '../models/themes/quill_dialog_theme.dart'; |
|
||||||
import '../models/themes/quill_icon_theme.dart'; |
|
||||||
import '../widgets/controller.dart'; |
|
||||||
import 'embed_types.dart'; |
import 'embed_types.dart'; |
||||||
import 'toolbar/camera_button.dart'; |
import 'toolbar/camera_button.dart'; |
||||||
import 'toolbar/formula_button.dart'; |
import 'toolbar/formula_button.dart'; |
||||||
import 'toolbar/image_button.dart'; |
import 'toolbar/image_button.dart'; |
||||||
import 'toolbar/video_button.dart'; |
import 'toolbar/video_button.dart'; |
||||||
|
|
||||||
abstract class IEmbedToolbar { |
export 'toolbar/image_button.dart'; |
||||||
Iterable<Widget> build(QuillController controller, double toolbarIconSize, |
export 'toolbar/image_video_utils.dart'; |
||||||
QuillIconTheme? iconTheme, QuillDialogTheme? dialogTheme); |
export 'toolbar/video_button.dart'; |
||||||
|
export 'toolbar/formula_button.dart'; |
||||||
bool get notEmpty; |
export 'toolbar/camera_button.dart'; |
||||||
} |
|
||||||
|
|
||||||
class EmbedToolbar implements IEmbedToolbar { |
class QuillEmbedToolbar implements IEmbedToolbar { |
||||||
EmbedToolbar({ |
QuillEmbedToolbar({ |
||||||
this.showImageButton = true, |
this.showImageButton = true, |
||||||
this.showVideoButton = true, |
this.showVideoButton = true, |
||||||
this.showCameraButton = true, |
this.showCameraButton = true, |
@ -1,11 +1,9 @@ |
|||||||
import 'package:flutter/material.dart'; |
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_quill/flutter_quill.dart' hide Text; |
||||||
import 'package:image_picker/image_picker.dart'; |
import 'package:image_picker/image_picker.dart'; |
||||||
|
|
||||||
import '../../models/themes/quill_icon_theme.dart'; |
import 'package:flutter_quill/translations.dart'; |
||||||
import '../../translations/toolbar.i18n.dart'; |
|
||||||
import '../../widgets/controller.dart'; |
|
||||||
import '../../widgets/toolbar.dart'; |
|
||||||
import '../default_embed_builder.dart'; |
|
||||||
import '../embed_types.dart'; |
import '../embed_types.dart'; |
||||||
import 'image_video_utils.dart'; |
import 'image_video_utils.dart'; |
||||||
|
|
@ -1,11 +1,6 @@ |
|||||||
import 'package:flutter/material.dart'; |
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_quill/flutter_quill.dart'; |
||||||
|
|
||||||
import '../../models/documents/nodes/embeddable.dart'; |
|
||||||
import '../../models/themes/quill_dialog_theme.dart'; |
|
||||||
import '../../models/themes/quill_icon_theme.dart'; |
|
||||||
import '../../widgets/controller.dart'; |
|
||||||
import '../../widgets/toolbar.dart'; |
|
||||||
import '../default_embed_builder.dart'; |
|
||||||
import '../embed_types.dart'; |
import '../embed_types.dart'; |
||||||
|
|
||||||
class FormulaButton extends StatelessWidget { |
class FormulaButton extends StatelessWidget { |
@ -1,12 +1,7 @@ |
|||||||
import 'package:flutter/material.dart'; |
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_quill/flutter_quill.dart'; |
||||||
import 'package:image_picker/image_picker.dart'; |
import 'package:image_picker/image_picker.dart'; |
||||||
|
|
||||||
import '../../models/documents/nodes/embeddable.dart'; |
|
||||||
import '../../models/themes/quill_dialog_theme.dart'; |
|
||||||
import '../../models/themes/quill_icon_theme.dart'; |
|
||||||
import '../../widgets/controller.dart'; |
|
||||||
import '../../widgets/toolbar.dart'; |
|
||||||
import '../default_embed_builder.dart'; |
|
||||||
import '../embed_types.dart'; |
import '../embed_types.dart'; |
||||||
import 'image_video_utils.dart'; |
import 'image_video_utils.dart'; |
||||||
|
|
@ -1,12 +1,7 @@ |
|||||||
import 'package:flutter/material.dart'; |
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_quill/flutter_quill.dart'; |
||||||
import 'package:image_picker/image_picker.dart'; |
import 'package:image_picker/image_picker.dart'; |
||||||
|
|
||||||
import '../../models/documents/nodes/embeddable.dart'; |
|
||||||
import '../../models/themes/quill_dialog_theme.dart'; |
|
||||||
import '../../models/themes/quill_icon_theme.dart'; |
|
||||||
import '../../widgets/controller.dart'; |
|
||||||
import '../../widgets/toolbar.dart'; |
|
||||||
import '../default_embed_builder.dart'; |
|
||||||
import '../embed_types.dart'; |
import '../embed_types.dart'; |
||||||
import 'image_video_utils.dart'; |
import 'image_video_utils.dart'; |
||||||
|
|
@ -0,0 +1,5 @@ |
|||||||
|
import 'package:string_validator/string_validator.dart'; |
||||||
|
|
||||||
|
bool isImageBase64(String imageUrl) { |
||||||
|
return !imageUrl.startsWith('http') && isBase64(imageUrl); |
||||||
|
} |
@ -1,10 +1,9 @@ |
|||||||
import 'package:flutter/gestures.dart'; |
import 'package:flutter/gestures.dart'; |
||||||
import 'package:flutter/material.dart'; |
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_quill/flutter_quill.dart'; |
||||||
import 'package:url_launcher/url_launcher.dart'; |
import 'package:url_launcher/url_launcher.dart'; |
||||||
import 'package:youtube_player_flutter_quill/youtube_player_flutter_quill.dart'; |
import 'package:youtube_player_flutter_quill/youtube_player_flutter_quill.dart'; |
||||||
|
|
||||||
import '../../widgets/default_styles.dart'; |
|
||||||
|
|
||||||
class YoutubeVideoApp extends StatefulWidget { |
class YoutubeVideoApp extends StatefulWidget { |
||||||
const YoutubeVideoApp( |
const YoutubeVideoApp( |
||||||
{required this.videoUrl, required this.context, required this.readOnly}); |
{required this.videoUrl, required this.context, required this.readOnly}); |
@ -0,0 +1,18 @@ |
|||||||
|
library flutter_quill_extensions; |
||||||
|
|
||||||
|
import 'package:flutter_quill/flutter_quill.dart'; |
||||||
|
|
||||||
|
import 'embeds/builders.dart'; |
||||||
|
|
||||||
|
export 'embeds/toolbar.dart'; |
||||||
|
export 'embeds/builders.dart'; |
||||||
|
export 'embeds/embed_types.dart'; |
||||||
|
export 'embeds/utils.dart'; |
||||||
|
|
||||||
|
class FlutterQuillEmbeds { |
||||||
|
static List<IEmbedBuilder> get builders => [ |
||||||
|
ImageEmbedBuilder(), |
||||||
|
VideoEmbedBuilder(), |
||||||
|
FormulaEmbedBuilder(), |
||||||
|
]; |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
name: flutter_quill_extensions |
||||||
|
description: Embed extensions for flutter_quill |
||||||
|
version: 0.0.1 |
||||||
|
homepage: https://bulletjournal.us/home/index.html |
||||||
|
#author: bulletjournal |
||||||
|
repository: https://github.com/singerdmx/flutter-quill/flutter_quill_extensions |
||||||
|
|
||||||
|
environment: |
||||||
|
sdk: ">=2.12.0 <3.0.0" |
||||||
|
flutter: ">=3.0.0" |
||||||
|
|
||||||
|
dependencies: |
||||||
|
flutter: |
||||||
|
sdk: flutter |
||||||
|
|
||||||
|
flutter_quill: ^6.0.0 |
||||||
|
|
||||||
|
image_picker: ^0.8.5+3 |
||||||
|
photo_view: ^0.14.0 |
||||||
|
video_player: ^2.4.2 |
||||||
|
youtube_player_flutter_quill: ^8.2.2 |
||||||
|
gallery_saver: ^2.3.2 |
||||||
|
math_keyboard: ^0.1.6 |
||||||
|
string_validator: ^0.3.0 |
||||||
|
|
||||||
|
dependency_overrides: |
||||||
|
flutter_quill: |
||||||
|
path: ../ |
||||||
|
|
||||||
|
dev_dependencies: |
||||||
|
flutter_test: |
||||||
|
sdk: flutter |
||||||
|
pedantic: ^1.11.1 |
||||||
|
|
||||||
|
# The following section is specific to Flutter packages. |
||||||
|
flutter: |
@ -0,0 +1,6 @@ |
|||||||
|
library flutter_quill.extensions; |
||||||
|
|
||||||
|
export 'src/models/documents/nodes/leaf.dart' hide Text; |
||||||
|
export 'src/models/rules/insert.dart'; |
||||||
|
export 'src/utils/platform.dart'; |
||||||
|
export 'src/utils/string.dart'; |
@ -0,0 +1,25 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
|
||||||
|
import '../models/documents/nodes/leaf.dart' as leaf; |
||||||
|
import '../models/themes/quill_dialog_theme.dart'; |
||||||
|
import '../models/themes/quill_icon_theme.dart'; |
||||||
|
import 'controller.dart'; |
||||||
|
|
||||||
|
abstract class IEmbedBuilder { |
||||||
|
String get key; |
||||||
|
|
||||||
|
Widget build( |
||||||
|
BuildContext context, |
||||||
|
QuillController controller, |
||||||
|
leaf.Embed node, |
||||||
|
bool readOnly, |
||||||
|
void Function(GlobalKey videoContainerKey)? onVideoInit, |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
abstract class IEmbedToolbar { |
||||||
|
Iterable<Widget> build(QuillController controller, double toolbarIconSize, |
||||||
|
QuillIconTheme? iconTheme, QuillDialogTheme? dialogTheme); |
||||||
|
|
||||||
|
bool get notEmpty; |
||||||
|
} |
@ -0,0 +1,3 @@ |
|||||||
|
library flutter_quill.translations; |
||||||
|
|
||||||
|
export 'src/translations/toolbar.i18n.dart'; |
Loading…
Reference in new issue