LCOV - code coverage report
Current view: top level - src/ui/editor/pages/helper_editor/helpers/editor_simple_helper - editor_simple_helper.dart (source / functions) Hit Total Coverage
Test: lcov.info Lines: 76 86 88.4 %
Date: 2020-12-04 18:41:24 Functions: 0 0 -

          Line data    Source code
       1             : import 'package:flutter/material.dart';
       2             : import 'package:flutter/services.dart';
       3             : import 'package:google_fonts/google_fonts.dart';
       4             : import 'package:mvvm_builder/mvvm_builder.dart';
       5             : import 'package:pal/src/database/entity/helper/helper_entity.dart';
       6             : import 'package:pal/src/injectors/editor_app/editor_app_injector.dart';
       7             : import 'package:pal/src/services/editor/helper/helper_editor_service.dart';
       8             : import 'package:pal/src/services/pal/pal_state_service.dart';
       9             : import 'package:pal/src/theme.dart';
      10             : import 'package:pal/src/ui/editor/pages/helper_editor/font_editor/pickers/font_weight_picker/font_weight_picker_loader.dart';
      11             : import 'package:pal/src/ui/editor/pages/helper_editor/helper_editor.dart';
      12             : import 'package:pal/src/ui/editor/pages/helper_editor/helper_editor_viewmodel.dart';
      13             : import 'package:pal/src/ui/editor/pages/helper_editor/widgets/color_picker.dart';
      14             : import 'package:pal/src/ui/editor/pages/helper_editor/widgets/editor_actionsbar.dart';
      15             : import 'package:pal/src/ui/editor/pages/helper_editor/widgets/editor_sending_overlay.dart';
      16             : import 'package:pal/src/ui/editor/widgets/editable_textfield.dart';
      17             : import 'package:pal/src/ui/shared/widgets/circle_button.dart';
      18             : import 'package:pal/src/ui/shared/widgets/overlayed.dart';
      19             : 
      20             : import 'editor_simple_helper_presenter.dart';
      21             : import 'editor_simple_helper_viewmodel.dart';
      22             : 
      23             : 
      24             : typedef UpdateBackgroundColor = void Function(Color aColor);
      25             : 
      26             : abstract class EditorSimpleHelperView {
      27             : 
      28             :   void showColorPickerDialog(
      29             :     SimpleHelperViewModel viewModel,
      30             :     UpdateBackgroundColor updateBackgroundColor
      31             :   );
      32             : 
      33             :   Future showLoadingScreen(ValueNotifier<SendingStatus> status);
      34             : 
      35             :   Future closeEditor();
      36             : 
      37             :   void closeLoadingScreen();
      38             : }
      39             : 
      40             : class EditorSimpleHelperPage extends StatelessWidget  {
      41             : 
      42             :   final SimpleHelperViewModel baseviewModel;
      43             : 
      44             :   final HelperEditorPageArguments arguments;
      45             : 
      46             :   final EditorHelperService helperService;
      47             : 
      48             :   final PalEditModeStateService palEditModeStateService;
      49             : 
      50             :   final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();
      51             : 
      52             :   final GlobalKey<FormState> formKey = GlobalKey<FormState>();
      53             : 
      54           1 :   EditorSimpleHelperPage._({
      55             :     Key key,
      56             :     this.helperService,
      57             :     @required this.baseviewModel,
      58             :     @required this.arguments,
      59             :     this.palEditModeStateService
      60           1 :   }) : super(key: key);
      61             : 
      62           1 :   factory EditorSimpleHelperPage.create({
      63             :     Key key,
      64             :     HelperEditorPageArguments parameters,
      65             :     EditorHelperService helperService,
      66             :     PalEditModeStateService palEditModeStateService,
      67             :     @required HelperViewModel helperViewModel
      68           1 :   }) => EditorSimpleHelperPage._(
      69             :     key: key,
      70             :     helperService: helperService,
      71             :     palEditModeStateService: palEditModeStateService,
      72           1 :     baseviewModel: SimpleHelperViewModel.fromHelperViewModel(helperViewModel),
      73             :     arguments: parameters,
      74             :   );
      75             : 
      76           0 :   factory EditorSimpleHelperPage.edit({
      77             :     Key key,
      78             :     HelperEditorPageArguments parameters,
      79             :     EditorHelperService helperService,
      80             :     PalEditModeStateService palEditModeStateService,
      81             :     @required HelperEntity helperEntity //FIXME should be an id and not entire entity
      82           0 :   }) => EditorSimpleHelperPage._(
      83             :     key: key,
      84             :     helperService: helperService,
      85             :     palEditModeStateService: palEditModeStateService,
      86           0 :     baseviewModel: SimpleHelperViewModel.fromHelperEntity(helperEntity),
      87             :     arguments: parameters,
      88             :   );
      89             : 
      90           1 :   @override
      91             :   Widget build(BuildContext context) {
      92           1 :     return MVVMPageBuilder<EditorSimpleHelperPresenter, SimpleHelperViewModel>()
      93           1 :       .build(
      94           1 :         key: ValueKey('palEditorSimpleHelperWidgetBuilder'),
      95             :         context: context,
      96           2 :         presenterBuilder: (context) => EditorSimpleHelperPresenter(
      97           1 :             new _EditorSimpleHelperPage(
      98           1 :               context, _scaffoldKey,
      99           1 :               palEditModeStateService ?? EditorInjector.of(context).palEditModeStateService
     100             :             ),
     101           1 :             baseviewModel,
     102           1 :             helperService ?? EditorInjector.of(context).helperService,
     103           1 :             arguments
     104             :         ),
     105           3 :         builder: (context, presenter, model) => _buildPage(context.buildContext, presenter, model),
     106             :       );
     107             :   }
     108             : 
     109           1 :   Widget _buildPage(
     110             :     final BuildContext context,
     111             :     final EditorSimpleHelperPresenter presenter,
     112             :     final SimpleHelperViewModel viewModel,
     113             :   ) {
     114           1 :     return Scaffold(
     115           1 :       key: _scaffoldKey,
     116             :       backgroundColor: Colors.transparent,
     117           1 :       body: EditorActionsBar(
     118           1 :         onCancel: presenter.onCancel,
     119           1 :         onValidate: presenter.onValidate,
     120           1 :         canValidate: viewModel.canValidate,
     121           1 :         child: GestureDetector(
     122           1 :           key: ValueKey('palEditorSimpleHelperWidget'),
     123           1 :           onTap: presenter.onOutsideTap,
     124           2 :           child: LayoutBuilder(builder: (context, constraints) {
     125           1 :             return Form(
     126           1 :               key: formKey,
     127             :               autovalidateMode: AutovalidateMode.onUserInteraction,
     128           1 :               child: Stack(
     129             :                 fit: StackFit.expand,
     130           1 :                 children: [
     131           1 :                   SingleChildScrollView(
     132           1 :                     child: Container(
     133           1 :                       height: constraints.maxHeight,
     134           1 :                       width: constraints.maxWidth,
     135           1 :                       child: Column(
     136           1 :                         children: [
     137           2 :                           Expanded(child: Container()),
     138           1 :                           Container(
     139           2 :                             width: constraints.maxWidth * 0.8,
     140           1 :                             child: EditableTextField.text(
     141           2 :                               outsideTapStream: presenter.editableTextFieldController.stream,
     142           1 :                               helperToolbarKey: ValueKey('palEditorSimpleHelperWidgetToolbar'),
     143           1 :                               textFormFieldKey: ValueKey('palSimpleHelperDetailField'),
     144           1 :                               onChanged: presenter.onDetailsFieldChanged,
     145           1 :                               onTextStyleChanged: presenter.onDetailsTextStyleChanged,
     146             :                               maxLines: 3,
     147             :                               maximumCharacterLength: 150,
     148             :                               minimumCharacterLength: 1,
     149           3 :                               fontFamilyKey: viewModel?.detailsField?.fontFamily?.value,
     150           3 :                               initialValue: viewModel?.detailsField?.text?.value,
     151           1 :                               inputFormatters: [
     152           1 :                                 FilteringTextInputFormatter.allow(
     153           1 :                                   new RegExp('^(.*(\n.*){0,2})'),
     154             :                                 ),
     155             :                               ],
     156           1 :                               backgroundBoxDecoration: BoxDecoration(
     157           3 :                                 color: viewModel?.bodyBox?.backgroundColor?.value ?? PalTheme.of(context).colors.light,
     158           1 :                                 borderRadius: BorderRadius.circular(6.0),
     159             :                               ),
     160           1 :                               backgroundPadding: EdgeInsets.only(
     161           4 :                                   bottom: MediaQuery.of(context).viewInsets.bottom > 0
     162           0 :                                           ? MediaQuery.of(context).viewInsets.bottom + 20.0
     163             :                                           : 110.0),
     164             :                               textFormFieldPadding: const EdgeInsets.symmetric(
     165             :                                 vertical: 16.0,
     166             :                                 horizontal: 33.0,
     167             :                               ),
     168           1 :                               textStyle: TextStyle(
     169           3 :                                   color: viewModel.detailsField?.fontColor?.value,
     170           4 :                                   fontSize: viewModel.detailsField?.fontSize?.value?.toDouble(),
     171           4 :                                   fontWeight: FontWeightMapper.toFontWeight(viewModel.detailsField?.fontWeight?.value,
     172             :                                 ),
     173           1 :                               ).merge(
     174           1 :                                 _googleCustomFont(
     175           3 :                                   viewModel.detailsField?.fontFamily?.value,
     176             :                                 ),
     177             :                               ),
     178             :                             ),
     179             :                           ),
     180             :                         ],
     181             :                       ),
     182             :                     ),
     183             :                   ),
     184           1 :                   Positioned(
     185             :                     top: 20.0,
     186             :                     left: 20.0,
     187           1 :                     child: SafeArea(
     188           1 :                       child: CircleIconButton(
     189           1 :                         key: ValueKey('pal_EditorSimpleHelperWidget_CircleBackground'),
     190           1 :                         icon: Icon(Icons.invert_colors),
     191           3 :                         backgroundColor: PalTheme.of(context).colors.light,
     192           1 :                         onTapCallback: presenter.onChangeColorRequest,
     193             :                       ),
     194             :                     ),
     195             :                   ),
     196             :                 ],
     197             :               ),
     198             :             );
     199             :           }),
     200             :         ),
     201             :       ),
     202             :     );
     203             :   }
     204             : 
     205             :   //TODO
     206             :   // maybe extension for this as it is used widely
     207           1 :   TextStyle _googleCustomFont(String fontFamily) {
     208           2 :     return (fontFamily != null && fontFamily.length > 0)
     209           1 :       ? GoogleFonts.getFont(fontFamily)
     210             :       : null;
     211             :   }
     212             : 
     213             : }
     214             : 
     215             : 
     216             : class _EditorSimpleHelperPage with EditorSendingOverlayMixin, EditorNavigationMixin implements EditorSimpleHelperView  {
     217             : 
     218             :   final BuildContext context;
     219             : 
     220             :   final GlobalKey<ScaffoldState> scaffoldKey;
     221             : 
     222             :   final PalEditModeStateService palEditModeStateService;
     223             : 
     224           1 :   _EditorSimpleHelperPage(this.context, this.scaffoldKey, this.palEditModeStateService);
     225             : 
     226           2 :   BuildContext get overlayContext => context;
     227             : 
     228           0 :   @override
     229             :   void showColorPickerDialog(
     230             :     final SimpleHelperViewModel viewModel,
     231             :     final UpdateBackgroundColor updateBackgroundColor,
     232             :     ) {
     233           0 :     HapticFeedback.selectionClick();
     234           0 :     showDialog(
     235           0 :       context: scaffoldKey.currentContext,
     236           0 :       child: ColorPickerDialog(
     237           0 :         placeholderColor: viewModel.bodyBox?.backgroundColor?.value,
     238             :         onColorSelected: updateBackgroundColor,
     239             :       ),
     240             :     );
     241             :   }
     242             : 
     243             : }

Generated by: LCOV version 1.14