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/project/app_icon_grabber_delegate.dart';
5 : import 'package:pal/src/services/editor/project/project_editor_service.dart';
6 : import 'package:pal/src/services/package_version.dart';
7 : import 'package:pal/src/theme.dart';
8 : import 'package:pal/src/ui/editor/pages/app_settings/app_settings_presenter.dart';
9 : import 'package:pal/src/ui/editor/pages/app_settings/app_settings_viewmodel.dart';
10 : import 'package:pal/src/ui/editor/pages/app_settings/widgets/animated_app_icon.dart';
11 : import 'package:pal/src/ui/editor/widgets/snackbar_mixin.dart';
12 :
13 : class AppSettingsPageArguments {
14 : final String pageId;
15 :
16 0 : AppSettingsPageArguments(
17 : this.pageId,
18 : );
19 : }
20 :
21 : abstract class AppSettingsView {
22 : showMessage(String message, bool success);
23 : getHeaderSize();
24 : }
25 :
26 : class AppSettingsPage extends StatelessWidget
27 : with SnackbarMixin
28 : implements AppSettingsView {
29 : final AppIconGrabberDelegate appIconGrabberDelegate;
30 : final PackageVersionReader packageVersionReader;
31 : final ProjectEditorService projectEditorService;
32 : final bool testMode;
33 :
34 : final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();
35 : final GlobalKey _headerKey = GlobalKey();
36 : final double _logoSize = 120.0;
37 :
38 1 : AppSettingsPage({
39 : Key key,
40 : this.appIconGrabberDelegate,
41 : this.packageVersionReader,
42 : this.projectEditorService,
43 : this.testMode = false,
44 : });
45 :
46 : final _mvvmPageBuilder =
47 : MVVMPageBuilder<AppSettingsPresenter, AppSettingsModel>();
48 :
49 1 : @override
50 : Widget build(BuildContext context) {
51 2 : return _mvvmPageBuilder.build(
52 1 : key: UniqueKey(),
53 : context: context,
54 2 : presenterBuilder: (context) => AppSettingsPresenter(
55 : this,
56 1 : packageVersionReader: packageVersionReader ??
57 0 : EditorInjector.of(context).packageVersionReader,
58 1 : projectEditorService: projectEditorService ??
59 0 : EditorInjector.of(context).projectEditorService,
60 1 : appIconGrabberDelegate: appIconGrabberDelegate ??
61 0 : EditorInjector.of(context).appIconGrabberDelegate,
62 : ),
63 1 : singleAnimControllerBuilder: (tickerProvider) {
64 1 : return AnimationController(
65 : vsync: tickerProvider,
66 1 : duration: Duration(
67 : milliseconds: 800,
68 : ),
69 : );
70 : },
71 1 : animListener: (context, presenter, model) {
72 1 : if (model.appIconAnimation) {
73 1 : context.animationController
74 1 : .forward()
75 3 : .then((value) => presenter.onAppIconAnimationEnd());
76 : }
77 : },
78 1 : builder: (context, presenter, model) {
79 1 : return Scaffold(
80 1 : key: _scaffoldKey,
81 : extendBodyBehindAppBar: true,
82 1 : appBar: AppBar(
83 1 : title: Text('Pal settings'),
84 : elevation: 0,
85 : backgroundColor: Colors.transparent,
86 : ),
87 1 : body: this._buildPage(context, presenter, model),
88 : );
89 : },
90 : );
91 : }
92 :
93 1 : Widget _buildAppIconButton(
94 : MvvmContext context,
95 : final AppSettingsModel model,
96 : final AppSettingsPresenter presenter,
97 : ) {
98 1 : return Align(
99 1 : key: ValueKey('pal_AppSettingsPage_AppIcon'),
100 : alignment: Alignment.topCenter,
101 1 : child: Padding(
102 1 : padding: EdgeInsets.only(
103 4 : top: (model.headerSize.height / 2) +
104 5 : ((model.headerSize.height - _logoSize) / 2),
105 : ),
106 1 : child: AnimatedAppIcon(
107 2 : radius: _logoSize / 2,
108 1 : animationController: context.animationController,
109 1 : onTap: presenter.refreshAppIcon,
110 1 : isSendingAppIcon: model.isSendingAppIcon,
111 1 : testMode: testMode,
112 : ),
113 : ),
114 : );
115 : }
116 :
117 1 : Widget _buildHeaderGradient(
118 : final BuildContext context,
119 : final AppSettingsModel model,
120 : ) {
121 1 : return Container(
122 1 : key: _headerKey,
123 1 : decoration: BoxDecoration(
124 2 : gradient: PalTheme.of(context).settingsSilverGradient,
125 : ),
126 : );
127 : }
128 :
129 1 : Widget _buildPage(
130 : final MvvmContext context,
131 : final AppSettingsPresenter presenter,
132 : final AppSettingsModel model,
133 : ) {
134 1 : return Stack(
135 1 : key: ValueKey('pal_AppSettingsPage_Stack'),
136 1 : children: [
137 1 : Column(
138 1 : children: [
139 1 : Flexible(
140 : flex: 9,
141 2 : child: _buildHeaderGradient(context.buildContext, model),
142 : ),
143 1 : Expanded(
144 : flex: 25,
145 1 : child: model.isLoadingAppInfo
146 0 : ? Center(
147 0 : child: CircularProgressIndicator(),
148 : )
149 2 : : _buildBody(context.buildContext, model),
150 : ),
151 : // Container(
152 : // width: double.infinity,
153 : // child: Padding(
154 : // padding: const EdgeInsets.only(
155 : // left: 16.0,
156 : // right: 16.0,
157 : // bottom: 16.0,
158 : // ),
159 : // child: SafeArea(
160 : // top: false,
161 : // child: _buildSaveButton(context, model),
162 : // ),
163 : // ),
164 : // ),
165 : ],
166 : ),
167 1 : if (model.headerSize != null)
168 1 : this._buildAppIconButton(context, model, presenter),
169 : ],
170 : );
171 : }
172 :
173 1 : Widget _buildBody(
174 : final BuildContext context,
175 : final AppSettingsModel model,
176 : ) {
177 1 : return ListView(
178 4 : padding: EdgeInsets.only(top: (_logoSize / 2) + 30.0),
179 1 : children: [
180 1 : Center(
181 1 : child: Text(
182 1 : model.appName ?? 'My app',
183 1 : style: TextStyle(
184 : fontWeight: FontWeight.w500,
185 : fontSize: 20,
186 : ),
187 : ),
188 : ),
189 1 : SizedBox(
190 : height: 8.0,
191 : ),
192 1 : Center(
193 1 : child: Text(
194 2 : 'Version ${model.appVersion ?? '--'}',
195 1 : style: TextStyle(
196 : fontWeight: FontWeight.bold,
197 : fontSize: 10.0,
198 : ),
199 : ),
200 : ),
201 1 : SizedBox(
202 : height: 32.0,
203 : ),
204 1 : Padding(
205 : padding: const EdgeInsets.symmetric(horizontal: 16.0),
206 1 : child: IgnorePointer(
207 1 : child: OutlineButton(
208 1 : child: Padding(
209 : padding: const EdgeInsets.symmetric(vertical: 15.0),
210 1 : child: Text(
211 : 'Beta account member',
212 1 : style: TextStyle(
213 3 : color: PalTheme.of(context).colors.color1,
214 : ),
215 : ),
216 : ),
217 1 : borderSide: BorderSide(
218 3 : color: PalTheme.of(context).colors.color1,
219 : ),
220 1 : shape: RoundedRectangleBorder(
221 1 : side: BorderSide(
222 3 : color: PalTheme.of(context).colors.color1,
223 : width: 3,
224 : style: BorderStyle.solid,
225 : ),
226 1 : borderRadius: BorderRadius.circular(10),
227 : ),
228 0 : onPressed: () {},
229 : ),
230 : ),
231 : ),
232 : ],
233 : );
234 : }
235 :
236 1 : @override
237 : showMessage(String message, bool success) {
238 2 : return showSnackbarMessage(_scaffoldKey, message, success);
239 : }
240 :
241 1 : @override
242 : getHeaderSize() {
243 3 : RenderBox _headerRenderBox = _headerKey.currentContext.findRenderObject();
244 1 : return _headerRenderBox.size;
245 : }
246 :
247 : // Widget _buildSaveButton(BuildContext context, final AppSettingsModel model) {
248 : // return RaisedButton(
249 : // key: ValueKey('pal_AppSettingsPage_SaveButton'),
250 : // disabledColor: PalTheme.of(context).colors.color4,
251 : // child: Text(
252 : // 'Save',
253 : // style: TextStyle(
254 : // color: Colors.white,
255 : // ),
256 : // ),
257 : // color: PalTheme.of(context).colors.color1,
258 : // onPressed: () {},
259 : // shape: RoundedRectangleBorder(
260 : // borderRadius: BorderRadius.circular(8.0),
261 : // ),
262 : // );
263 : // }
264 : }
|