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_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 'toolbar/camera_button.dart'; |
||||
import 'toolbar/formula_button.dart'; |
||||
import 'toolbar/image_button.dart'; |
||||
import 'toolbar/video_button.dart'; |
||||
|
||||
abstract class IEmbedToolbar { |
||||
Iterable<Widget> build(QuillController controller, double toolbarIconSize, |
||||
QuillIconTheme? iconTheme, QuillDialogTheme? dialogTheme); |
||||
|
||||
bool get notEmpty; |
||||
} |
||||
export 'toolbar/image_button.dart'; |
||||
export 'toolbar/image_video_utils.dart'; |
||||
export 'toolbar/video_button.dart'; |
||||
export 'toolbar/formula_button.dart'; |
||||
export 'toolbar/camera_button.dart'; |
||||
|
||||
class EmbedToolbar implements IEmbedToolbar { |
||||
EmbedToolbar({ |
||||
class QuillEmbedToolbar implements IEmbedToolbar { |
||||
QuillEmbedToolbar({ |
||||
this.showImageButton = true, |
||||
this.showVideoButton = true, |
||||
this.showCameraButton = true, |
@ -1,11 +1,9 @@ |
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_quill/flutter_quill.dart' hide Text; |
||||
import 'package:image_picker/image_picker.dart'; |
||||
|
||||
import '../../models/themes/quill_icon_theme.dart'; |
||||
import '../../translations/toolbar.i18n.dart'; |
||||
import '../../widgets/controller.dart'; |
||||
import '../../widgets/toolbar.dart'; |
||||
import '../default_embed_builder.dart'; |
||||
import 'package:flutter_quill/translations.dart'; |
||||
|
||||
import '../embed_types.dart'; |
||||
import 'image_video_utils.dart'; |
||||
|
@ -1,11 +1,6 @@ |
||||
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'; |
||||
|
||||
class FormulaButton extends StatelessWidget { |
@ -1,12 +1,7 @@ |
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_quill/flutter_quill.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 'image_video_utils.dart'; |
||||
|
@ -1,12 +1,7 @@ |
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_quill/flutter_quill.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 '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/material.dart'; |
||||
import 'package:flutter_quill/flutter_quill.dart'; |
||||
import 'package:url_launcher/url_launcher.dart'; |
||||
import 'package:youtube_player_flutter_quill/youtube_player_flutter_quill.dart'; |
||||
|
||||
import '../../widgets/default_styles.dart'; |
||||
|
||||
class YoutubeVideoApp extends StatefulWidget { |
||||
const YoutubeVideoApp( |
||||
{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