Line data Source code
1 : // Copyright 2023 The terCAD team. All rights reserved.
2 : // Use of this source code is governed by a CC BY-NC-ND 4.0 license that can be found in the LICENSE file.
3 :
4 : import 'package:app_finance/_classes/herald/app_locale.dart';
5 : import 'package:app_finance/_classes/storage/app_preferences.dart';
6 : import 'package:app_finance/_configs/custom_text_theme.dart';
7 : import 'package:app_finance/_configs/theme_helper.dart';
8 : import 'package:app_finance/_ext/build_context_ext.dart';
9 : import 'package:app_finance/components/_core/components_builder.dart';
10 : import 'package:app_finance/components/_core/component_data.dart';
11 : import 'package:app_finance/components/_core/list_component_registry.dart';
12 : import 'package:app_finance/design/wrapper/confirmation_wrapper.dart';
13 : import 'package:app_finance/design/button/toolbar_button_widget.dart';
14 : import 'package:flutter/material.dart';
15 :
16 : class HomeEditPage extends StatefulWidget {
17 : final Function callback;
18 :
19 0 : const HomeEditPage({super.key, required this.callback});
20 :
21 0 : @override
22 0 : HomeEditPageState createState() => HomeEditPageState();
23 : }
24 :
25 : class HomeEditPageState extends State<HomeEditPage> {
26 : List<ComponentData> data = [];
27 : late String key;
28 :
29 0 : Future<void> _save() async {
30 0 : await AppPreferences.set(key, data.toString());
31 0 : setState(() {});
32 : }
33 :
34 0 : Future<void> save() async {
35 0 : await _save();
36 0 : widget.callback();
37 : }
38 :
39 0 : Future<void> drop() async {
40 0 : await AppPreferences.clear(key);
41 0 : widget.callback();
42 : }
43 :
44 0 : Future<void> add(String key) async {
45 0 : data.add({
46 : componentData.key: key,
47 : componentData.startX: 0,
48 : componentData.startY: 0,
49 : componentData.endX: 4,
50 : componentData.endY: 4,
51 : });
52 0 : await _save();
53 : }
54 :
55 0 : Future<void> adjust(int index, ComponentData change) async {
56 0 : data[index] = change;
57 0 : await _save();
58 : }
59 :
60 0 : Future<void> delete(int index) async {
61 0 : data.removeAt(index);
62 0 : await _save();
63 : }
64 :
65 0 : @override
66 : Widget build(BuildContext context) {
67 0 : key = ComponentsBuilder.getKey(context);
68 0 : data = ComponentsBuilder.getData(context) ?? [];
69 0 : return Scaffold(
70 0 : appBar: AppBar(
71 : toolbarHeight: 45,
72 0 : backgroundColor: context.colorScheme.primary,
73 0 : title: Text(ComponentsBuilder.getKey(context)),
74 0 : titleTextStyle: context.textTheme.numberMedium,
75 : centerTitle: true,
76 : leadingWidth: 120,
77 0 : leading: Row(
78 0 : children: [
79 0 : ToolbarButtonWidget(
80 : icon: Icons.save,
81 : color: Colors.white70,
82 0 : tooltip: AppLocale.labels.customSaveTooltip,
83 0 : onPressed: save,
84 : ),
85 0 : ToolbarButtonWidget(
86 : icon: Icons.cancel,
87 : color: Colors.white70,
88 0 : tooltip: AppLocale.labels.customDeleteTooltip,
89 0 : onPressed: () => ConfirmationWrapper.show(context, drop),
90 : ),
91 : ],
92 : ),
93 0 : actions: [
94 0 : Container(
95 : width: 140,
96 0 : padding: EdgeInsets.all(ThemeHelper.getIndent(0.5)),
97 0 : child: ListComponentRegistry(
98 0 : setState: (v) => add(v?.id ?? ''),
99 0 : hintText: AppLocale.labels.customAddTooltip,
100 0 : hintStyle: context.textTheme.numberSmall.copyWith(color: Colors.white70),
101 : ),
102 : ),
103 : ],
104 : ),
105 0 : body: Padding(
106 0 : padding: EdgeInsets.all(ThemeHelper.getIndent(3)),
107 0 : child: ComponentsBuilder(data, editMode: true, adjust: adjust, delete: delete),
108 : ),
109 : );
110 : }
111 : }
|