pull/1446/head
Ahmed Hnewa 2 years ago
parent f8c2496c48
commit 15687259c0
No known key found for this signature in database
GPG Key ID: C488CC70BBCEF0D1
  1. 1
      .github/PULL_REQUEST_TEMPLATE.md
  2. 23
      before-push.sh
  3. 2
      flutter_quill_extensions/lib/embeds/builders.dart
  4. 2
      flutter_quill_extensions/lib/embeds/toolbar/camera_button.dart
  5. 2
      flutter_quill_extensions/lib/embeds/toolbar/image_video_utils.dart
  6. 2
      flutter_quill_extensions/lib/embeds/toolbar/media_button.dart
  7. 6
      flutter_quill_extensions/pubspec.yaml
  8. 1
      lib/src/models/config/toolbar/configurations.dart
  9. 7
      lib/src/utils/platform.dart
  10. 3
      lib/src/widgets/raw_editor/raw_editor.dart
  11. 47
      lib/src/widgets/toolbar.dart
  12. 20
      lib/src/widgets/toolbar/buttons/font_family.dart
  13. 5
      lib/src/widgets/toolbar/buttons/history.dart
  14. 4
      lib/src/widgets/toolbar/enum.dart
  15. 1
      test/widgets/editor_test.dart

@ -43,3 +43,4 @@ Closes #IssueNumber
- [ ] I have run `dart format .`` on the project <!-- REQUIRED --> - [ ] I have run `dart format .`` on the project <!-- REQUIRED -->
- [ ] I have run `dart fix --apply` on the project <!-- REQUIRED --> - [ ] I have run `dart fix --apply` on the project <!-- REQUIRED -->
- [ ] I have run `flutter test` and `flutter analyze` and it passed successfully <!-- REQUIRED --> - [ ] I have run `flutter test` and `flutter analyze` and it passed successfully <!-- REQUIRED -->
- [ ] I have run `./before-push.sh` and everything is fine <!-- Optional >

@ -0,0 +1,23 @@
#!/bin/bash
# Run Flutter analyze
echo "Running 'flutter analyze'..."
flutter analyze
# Run Flutter test
echo "Running 'flutter test'..."
flutter test
# Check if package is ready for publishing
echo "Running 'flutter pub publish --dry-run'..."
flutter pub publish --dry-run
# Apply Dart fixes
echo "Running 'dart fix --apply'..."
dart fix --apply
# Format Dart code
echo "Running 'dart format .'"
dart format .
echo "Script completed."

@ -5,7 +5,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_quill/extensions.dart' as base; import 'package:flutter_quill/extensions.dart' as base;
import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/flutter_quill.dart' hide Text;
import 'package:flutter_quill/translations.dart'; import 'package:flutter_quill/translations.dart';
import 'package:math_keyboard/math_keyboard.dart'; import 'package:math_keyboard/math_keyboard.dart';
import 'package:universal_html/html.dart' as html; import 'package:universal_html/html.dart' as html;

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/flutter_quill.dart' hide Text;
import 'package:flutter_quill/translations.dart'; import 'package:flutter_quill/translations.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';

@ -3,7 +3,7 @@ import 'dart:io' show File;
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_quill/extensions.dart'; import 'package:flutter_quill/extensions.dart';
import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/flutter_quill.dart' hide Text;
import 'package:flutter_quill/translations.dart'; import 'package:flutter_quill/translations.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';

@ -4,7 +4,7 @@ import 'dart:ui';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_quill/extensions.dart'; import 'package:flutter_quill/extensions.dart';
import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/flutter_quill.dart' hide Text;
import 'package:flutter_quill/translations.dart'; import 'package:flutter_quill/translations.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';

@ -19,10 +19,10 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
# flutter_quill: ^7.5.0 flutter_quill: ^7.5.0
# In case you are working on changes for both libraries, # In case you are working on changes for both libraries,
flutter_quill: # flutter_quill:
path: /Users/ahmedhnewa/development/playground/framework_based/flutter/flutter-quill # path: ~/development/playground/framework_based/flutter/flutter-quill
http: ^1.1.0 http: ^1.1.0
image_picker: ">=1.0.4" image_picker: ">=1.0.4"

@ -1,5 +1,4 @@
import 'package:flutter/foundation.dart' show immutable; import 'package:flutter/foundation.dart' show immutable;
import 'package:flutter/material.dart' show Icons;
import '../../documents/attribute.dart'; import '../../documents/attribute.dart';
import 'buttons/base.dart'; import 'buttons/base.dart';

@ -1,3 +1,5 @@
import 'dart:io' show Platform;
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/foundation.dart' import 'package:flutter/foundation.dart'
show kIsWeb, TargetPlatform, defaultTargetPlatform; show kIsWeb, TargetPlatform, defaultTargetPlatform;
@ -39,6 +41,11 @@ bool isMacOS([TargetPlatform? targetPlatform]) {
return TargetPlatform.macOS == targetPlatform; return TargetPlatform.macOS == targetPlatform;
} }
bool isFlutterTest() {
if (isWeb()) return false;
return Platform.environment.containsKey('FLUTTER_TEST');
}
Future<bool> isIOSSimulator() async { Future<bool> isIOSSimulator() async {
if (!isAppleOS()) { if (!isAppleOS()) {
return false; return false;

@ -1,6 +1,5 @@
import 'dart:async' show StreamSubscription; import 'dart:async' show StreamSubscription;
import 'dart:convert' show jsonDecode; import 'dart:convert' show jsonDecode;
import 'dart:io' show Platform;
import 'dart:math' as math; import 'dart:math' as math;
import 'dart:ui' as ui hide TextStyle; import 'dart:ui' as ui hide TextStyle;
@ -1074,7 +1073,7 @@ class RawEditorState extends EditorState
if (isKeyboardOS()) { if (isKeyboardOS()) {
_keyboardVisible = true; _keyboardVisible = true;
} else if (!isWeb() && Platform.environment.containsKey('FLUTTER_TEST')) { } else if (!isWeb() && isFlutterTest()) {
// treat tests like a keyboard OS // treat tests like a keyboard OS
_keyboardVisible = true; _keyboardVisible = true;
} else { } else {

@ -11,11 +11,11 @@ export '../models/config/toolbar/configurations.dart';
export 'toolbar/buttons/clear_format.dart'; export 'toolbar/buttons/clear_format.dart';
export 'toolbar/buttons/color.dart'; export 'toolbar/buttons/color.dart';
export 'toolbar/buttons/custom_button.dart'; export 'toolbar/buttons/custom_button.dart';
export 'toolbar/buttons/font_family.dart';
export 'toolbar/buttons/history.dart'; export 'toolbar/buttons/history.dart';
export 'toolbar/buttons/indent.dart'; export 'toolbar/buttons/indent.dart';
export 'toolbar/buttons/link_style.dart'; export 'toolbar/buttons/link_style.dart';
export 'toolbar/buttons/link_style2.dart'; export 'toolbar/buttons/link_style2.dart';
export 'toolbar/buttons/font_family.dart';
export 'toolbar/buttons/quill_font_size.dart'; export 'toolbar/buttons/quill_font_size.dart';
export 'toolbar/buttons/quill_icon.dart'; export 'toolbar/buttons/quill_icon.dart';
export 'toolbar/buttons/search.dart'; export 'toolbar/buttons/search.dart';
@ -173,6 +173,8 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
//default button tooltips //default button tooltips
final buttonTooltips = tooltips ?? final buttonTooltips = tooltips ??
<ToolbarButtons, String>{ <ToolbarButtons, String>{
// ToolbarButtons.undo: 'Undo'.i18n,
// ToolbarButtons.redo: 'Redo'.i18n,
ToolbarButtons.fontFamily: 'Font family'.i18n, ToolbarButtons.fontFamily: 'Font family'.i18n,
ToolbarButtons.fontSize: 'Font size'.i18n, ToolbarButtons.fontSize: 'Font size'.i18n,
ToolbarButtons.bold: 'Bold'.i18n, ToolbarButtons.bold: 'Bold'.i18n,
@ -227,16 +229,43 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
options: options:
toolbarConfigurations.buttonOptions.undoHistoryButtonOptions, toolbarConfigurations.buttonOptions.undoHistoryButtonOptions,
), ),
// QuillToolbarHistoryButton(
// icon: Icons.undo_outlined,
// iconSize: toolbarIconSize,
// tooltip: buttonTooltips[ToolbarButtons.undo],
// controller: controller,
// undo: true,
// iconTheme: iconTheme,
// afterButtonPressed: afterButtonPressed,
// ),
if (showRedo) if (showRedo)
QuillToolbarHistoryButton( QuillToolbarHistoryButton(
options: options:
toolbarConfigurations.buttonOptions.redoHistoryButtonOptions, toolbarConfigurations.buttonOptions.redoHistoryButtonOptions,
), ),
// QuillToolbarHistoryButton(
// icon: Icons.redo_outlined,
// iconSize: toolbarIconSize,
// tooltip: buttonTooltips[ToolbarButtons.redo],
// controller: controller,
// undo: false,
// iconTheme: iconTheme,
// afterButtonPressed: afterButtonPressed,
// ),
if (showFontFamily) if (showFontFamily)
QuillToolbarFontFamilyButton( QuillToolbarFontFamilyButton(
options: options:
toolbarConfigurations.buttonOptions.fontFamilyButtonOptions, toolbarConfigurations.buttonOptions.fontFamilyButtonOptions,
), ),
// QuillFontFamilyButton(
// iconTheme: iconTheme,
// iconSize: toolbarIconSize,
// tooltip: buttonTooltips[ToolbarButtons.fontFamily],
// attribute: Attribute.font,
// controller: controller,
// rawItemsMap: {},
// afterButtonPressed: afterButtonPressed,
// ),
if (showFontSize) if (showFontSize)
QuillFontSizeButton( QuillFontSizeButton(
iconTheme: iconTheme, iconTheme: iconTheme,
@ -596,16 +625,14 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
/// The decoration to use for the toolbar. /// The decoration to use for the toolbar.
final Decoration? decoration; final Decoration? decoration;
// We can't get the modified [toolbarSize] by the developer
// but I tested the [QuillToolbar] on the [appBar] and I didn't notice
// a difference no matter what the value is so I will leave it to the
// default
@override @override
Size get preferredSize { Size get preferredSize => axis == Axis.horizontal
// We can't get the modified [toolbarSize] by the developer ? const Size.fromHeight(defaultToolbarSize)
// but I tested the [QuillToolbar] on the [appBar] and I didn't notice : const Size.fromWidth(defaultToolbarSize);
// a difference no matter what the value is so I will leave it to the
// default
return axis == Axis.horizontal
? const Size.fromHeight(defaultToolbarSize)
: const Size.fromWidth(defaultToolbarSize);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -1,12 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../../extensions.dart';
import '../../../models/config/toolbar/buttons/font_family.dart'; import '../../../models/config/toolbar/buttons/font_family.dart';
import '../../../models/documents/attribute.dart'; import '../../../models/documents/attribute.dart';
import '../../../models/documents/style.dart'; import '../../../models/documents/style.dart';
import '../../../translations/toolbar.i18n.dart'; import '../../../translations/toolbar.i18n.dart';
import '../../../utils/extensions/build_context.dart'; import '../../../utils/extensions/build_context.dart';
import '../../../utils/extensions/quill_controller.dart'; import '../../../utils/extensions/quill_controller.dart';
import '../../../utils/widgets.dart';
import '../../controller.dart'; import '../../controller.dart';
class QuillToolbarFontFamilyButton extends StatefulWidget { class QuillToolbarFontFamilyButton extends StatefulWidget {
@ -34,6 +34,12 @@ class _QuillToolbarFontFamilyButtonState
return widget.options; return widget.options;
} }
/// Since t's not safe to call anything related to the context in dispose
/// then we will save a reference to the [controller]
/// and update it in [didChangeDependencies]
/// and use it in dispose method
late QuillController _controller;
QuillController get controller { QuillController get controller {
return options.controller.notNull(context); return options.controller.notNull(context);
} }
@ -47,6 +53,10 @@ class _QuillToolbarFontFamilyButtonState
} }
Future<void> _initState() async { Future<void> _initState() async {
if (isFlutterTest()) {
// We don't need to listen for changes in the tests
return;
}
await Future.delayed(Duration.zero); await Future.delayed(Duration.zero);
setState(() { setState(() {
_currentValue = _defaultDisplayText = options.initialValue ?? 'Font'.i18n; _currentValue = _defaultDisplayText = options.initialValue ?? 'Font'.i18n;
@ -54,9 +64,15 @@ class _QuillToolbarFontFamilyButtonState
controller.addListener(_didChangeEditingValue); controller.addListener(_didChangeEditingValue);
} }
@override
void didChangeDependencies() {
super.didChangeDependencies();
_controller = controller;
}
@override @override
void dispose() { void dispose() {
controller.removeListener(_didChangeEditingValue); _controller.removeListener(_didChangeEditingValue);
super.dispose(); super.dispose();
} }

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../../../extensions.dart';
import '../../../../translations.dart'; import '../../../../translations.dart';
import '../../../utils/extensions/build_context.dart'; import '../../../utils/extensions/build_context.dart';
import '../../../utils/extensions/quill_controller.dart'; import '../../../utils/extensions/quill_controller.dart';
@ -38,6 +39,10 @@ class _QuillToolbarHistoryButtonState extends State<QuillToolbarHistoryButton> {
} }
Future<void> _listenForChanges() async { Future<void> _listenForChanges() async {
if (isFlutterTest()) {
// We don't need to listen for changes in the tests
return;
}
await Future.delayed(Duration.zero); // Wait for the widget to built await Future.delayed(Duration.zero); // Wait for the widget to built
_updateCanPressed(); // Set the init state _updateCanPressed(); // Set the init state

@ -1,8 +1,8 @@
enum ToolbarButtons { enum ToolbarButtons {
// Not needed anymore, the dev can customize this much easier now // Not needed anymore, the dev can customize this much easier now
// in the toolbarConfigurations of the QuillProvider // in the toolbarConfigurations of the QuillProvider
// undo, undo,
// redo, redo,
fontFamily, fontFamily,
fontSize, fontSize,
bold, bold,

@ -4,7 +4,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/flutter_quill.dart';
import 'package:flutter_quill/flutter_quill_test.dart'; import 'package:flutter_quill/flutter_quill_test.dart';
import 'package:flutter_quill/src/models/config/editor/configurations.dart';
import 'package:flutter_quill/src/widgets/raw_editor/raw_editor.dart'; import 'package:flutter_quill/src/widgets/raw_editor/raw_editor.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';

Loading…
Cancel
Save