Line data Source code
1 : import 'package:flutter/material.dart';
2 : import 'package:mvvm_builder/mvvm_builder.dart';
3 : import 'package:pal/src/injectors/editor_app/editor_app_injector.dart';
4 : import 'package:pal/src/services/editor/helper/helper_editor_service.dart';
5 : import 'package:pal/src/ui/client/helpers/anchored_helper_widget.dart';
6 :
7 : import '../../helper_editor.dart';
8 : import '../../helper_editor_viewmodel.dart';
9 : import 'editor_anchored_helper_presenter.dart';
10 : import 'editor_anchored_helper_viewmodel.dart';
11 :
12 : abstract class EditorAnchoredFullscreenHelperView {
13 :
14 : }
15 :
16 :
17 : class EditorAnchoredFullscreenHelper extends StatelessWidget implements EditorAnchoredFullscreenHelperView {
18 :
19 1 : EditorAnchoredFullscreenHelper._({
20 : Key key,
21 1 : }) : super(key: key);
22 :
23 1 : factory EditorAnchoredFullscreenHelper.create({
24 : Key key,
25 : HelperEditorPageArguments parameters,
26 : EditorHelperService helperService,
27 : @required HelperViewModel helperViewModel
28 1 : }) => EditorAnchoredFullscreenHelper._(
29 : key: key,
30 : );
31 :
32 1 : @override
33 : Widget build(BuildContext context) {
34 1 : return MVVMPage<EditorAnchoredFullscreenPresenter, AnchoredFullscreenHelperViewModel>(
35 1 : key: ValueKey("EditorAnchoredFullscreenHelperPage"),
36 1 : presenter: EditorAnchoredFullscreenPresenter(
37 : this,
38 2 : EditorInjector.of(context).finderService
39 : ),
40 1 : builder: (context, presenter, model) =>
41 1 : Material(
42 1 : color: Colors.black.withOpacity(0.3),
43 1 : child: Stack(
44 1 : children: [
45 1 : _createAnchoredWidget(model),
46 1 : _buildEditableTexts(presenter, model),
47 1 : ..._createSelectableElements(presenter, model),
48 1 : _buildRefreshButton(presenter)
49 : ],
50 : ),
51 : ),
52 : );
53 : }
54 :
55 1 : _createSelectableElements(EditorAnchoredFullscreenPresenter presenter, AnchoredFullscreenHelperViewModel model) {
56 1 : return model.userPageElements
57 3 : .map((key, model) => new MapEntry(
58 : key,
59 3 : _WidgetElementModelTransformer().apply(key, model, presenter.onTapElement))
60 : )
61 2 : .values.toList();
62 : }
63 :
64 1 : _createAnchoredWidget(AnchoredFullscreenHelperViewModel model) {
65 1 : final element = model.selectedAnchor;
66 1 : return Positioned.fill(
67 1 : child: Visibility(
68 1 : visible: model.selectedAnchor != null,
69 1 : child: SizedBox(
70 1 : child: CustomPaint(
71 1 : painter: AnchoredFullscreenPainter(
72 2 : currentPos: element?.value?.offset,
73 3 : anchorSize: element?.value?.rect?.size,
74 : padding: 0
75 : )
76 : )
77 : ),
78 : )
79 : );
80 : }
81 :
82 1 : _buildRefreshButton(EditorAnchoredFullscreenPresenter presenter) {
83 1 : return Positioned(
84 : top: 32, right: 32,
85 1 : child: FlatButton.icon(
86 1 : key: ValueKey("refreshButton"),
87 1 : onPressed: presenter.scanElements,
88 : color: Colors.black,
89 1 : icon: Icon(Icons.refresh, color: Colors.white,),
90 2 : label: Text("refresh", style: TextStyle(color: Colors.white),)
91 : ),
92 : );
93 : }
94 :
95 1 : _buildEditableTexts(EditorAnchoredFullscreenPresenter presenter, AnchoredFullscreenHelperViewModel model) {
96 2 : if(model.writeArea == null || model.selectedAnchor == null)
97 1 : return Container();
98 1 : return Positioned.fromRect(
99 1 : rect: model.writeArea ?? Rect.largest,
100 1 : child: Column(
101 : mainAxisAlignment: MainAxisAlignment.center,
102 : crossAxisAlignment: CrossAxisAlignment.center,
103 1 : children: [
104 1 : Padding(
105 : padding: const EdgeInsets.all(8.0),
106 1 : child: Text(
107 1 : model.title,
108 : textAlign: TextAlign.center,
109 1 : style: TextStyle(
110 : fontSize: 24
111 : ),
112 : ),
113 : ),
114 1 : Padding(
115 : padding: const EdgeInsets.all(8.0),
116 1 : child: Text(
117 1 : model.description,
118 : textAlign: TextAlign.center,
119 1 : style: TextStyle(
120 : fontSize: 18
121 : ),
122 : ),
123 : ),
124 1 : _buildPositivFeedback(),
125 1 : _buildNegativFeedback(),
126 : ],
127 : ),
128 : );
129 : }
130 :
131 1 : Widget _buildNegativFeedback() {
132 1 : return Padding(
133 : padding: const EdgeInsets.only(top: 16.0),
134 1 : child: InkWell(
135 1 : key: ValueKey("negativeFeedback"),
136 1 : child: Text(
137 : "This is not helping",
138 1 : style: TextStyle(
139 : // color: widget.textColor, fontSize: 10
140 : ),
141 : textAlign: TextAlign.center,
142 : ),
143 : // onTap: this.widget.onTrigger,
144 : ),
145 : );
146 : }
147 :
148 1 : Widget _buildPositivFeedback() {
149 1 : return Padding(
150 : padding: const EdgeInsets.only(top: 24.0),
151 1 : child: InkWell(
152 1 : key: ValueKey("positiveFeedback"),
153 1 : child: Text(
154 : "Ok, thanks !",
155 1 : style: TextStyle(
156 : // color: widget.textColor,
157 : fontSize: 18,
158 : decoration: TextDecoration.underline,
159 : ),
160 : textAlign: TextAlign.center,
161 : ),
162 : // onTap: this.widget.onTrigger,
163 : ),
164 : );
165 : }
166 :
167 : }
168 :
169 :
170 : typedef OnTapElement = void Function(String key);
171 :
172 : class _WidgetElementModelTransformer {
173 :
174 1 : Widget apply(String key, WidgetElementModel model, OnTapElement onTap) {
175 1 : return Positioned(
176 2 : left: model.offset.dx,
177 2 : top: model.offset.dy,
178 1 : child: InkWell(
179 1 : key: ValueKey("elementContainer"),
180 2 : onTap: () => onTap(key),
181 1 : child: Container(
182 2 : width: model.rect.width,
183 2 : height: model.rect.height,
184 1 : decoration: BoxDecoration(
185 1 : border: Border.all(
186 2 : color: Colors.white.withOpacity(model.selected ? 1 : .5),
187 1 : width: model.selected ? 4 : 2,
188 : ),
189 : ),
190 1 : child: Align(
191 : alignment: Alignment.bottomRight,
192 1 : child: Padding(
193 : padding: const EdgeInsets.all(8.0),
194 : // child: Text("$key",
195 : // style: TextStyle(color: Colors.white)
196 : // ),
197 : ),
198 : ),
199 : ),
200 : )
201 : );
202 : }
203 :
204 : }
|