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 : }
|