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_design.dart';
5 : import 'package:app_finance/_classes/structure/navigation/app_route.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/charts/bar_horizontal_single.dart';
10 : import 'package:app_finance/design/generic/base_swipe_widget.dart';
11 : import 'package:app_finance/design/wrapper/number_wrapper.dart';
12 : import 'package:app_finance/design/wrapper/row_widget.dart';
13 : import 'package:app_finance/design/wrapper/tap_widget.dart';
14 : import 'package:app_finance/design/wrapper/text_wrapper.dart';
15 : import 'package:flutter/material.dart';
16 :
17 : class BudgetLineWidget extends StatelessWidget {
18 : final String uuid;
19 : final String title;
20 : final String details;
21 : final String description;
22 : final double progress;
23 : final String amount;
24 : final Color color;
25 : final IconData icon;
26 : final double width;
27 : final String route;
28 : final bool hidden;
29 : final bool showDivider;
30 : final int count;
31 :
32 1 : const BudgetLineWidget({
33 : super.key,
34 : required this.uuid,
35 : required this.title,
36 : required this.details,
37 : required this.description,
38 : required this.color,
39 : required this.amount,
40 : required this.icon,
41 : required this.width,
42 : this.count = 1,
43 : this.hidden = false,
44 : this.progress = 1,
45 : this.route = '',
46 : this.showDivider = true,
47 : });
48 :
49 1 : @override
50 : Widget build(BuildContext context) {
51 1 : if (hidden) {
52 : return ThemeHelper.emptyBox;
53 : }
54 1 : final indent = ThemeHelper.getIndent();
55 1 : final textTheme = context.textTheme;
56 : const iconSize = 18.0;
57 1 : return BaseSwipeWidget(
58 : routePath: AppRoute.budgetEditRoute,
59 1 : uuid: uuid,
60 1 : child: TapWidget(
61 : tooltip: '',
62 4 : route: RouteSettings(name: route, arguments: {routeArguments.uuid: uuid}),
63 1 : child: Column(
64 1 : crossAxisAlignment: AppDesign.getAlignment(),
65 1 : children: [
66 2 : count > 2
67 0 : ? Padding(
68 0 : padding: EdgeInsets.symmetric(vertical: indent),
69 0 : child: RowWidget(
70 : chunk: const [20, null, 0.3, 0.15, 0.1],
71 : indent: indent,
72 0 : maxWidth: width,
73 0 : children: [
74 0 : [
75 0 : Icon(icon, color: color, size: iconSize),
76 : ],
77 0 : [
78 0 : TextWrapper(title, style: textTheme.headlineMedium),
79 : ],
80 0 : [
81 0 : Align(
82 : alignment: Alignment.centerRight,
83 0 : child: TextWrapper(description, style: textTheme.numberMedium),
84 : ),
85 : ],
86 0 : [
87 0 : Align(
88 : alignment: Alignment.centerRight,
89 : child:
90 0 : NumberWidget(amount, colorScheme: context.colorScheme, style: textTheme.numberMedium),
91 : ),
92 : ],
93 0 : [
94 0 : Container(
95 : alignment: Alignment.centerRight,
96 0 : padding: EdgeInsets.only(right: indent * 2),
97 : child:
98 0 : NumberWidget(details, colorScheme: context.colorScheme, style: textTheme.numberMedium),
99 : ),
100 : ],
101 : ],
102 : ),
103 : )
104 1 : : RowWidget(
105 1 : chunk: [
106 : iconSize,
107 : null,
108 4 : ThemeHelper.getTextWidth(Text(details, style: textTheme.numberMedium)),
109 : ],
110 : indent: indent,
111 2 : maxWidth: width + indent,
112 1 : children: [
113 1 : [
114 3 : Icon(icon, color: color, size: iconSize),
115 : ],
116 2 : if (description != '')
117 1 : [
118 1 : Column(
119 1 : crossAxisAlignment: AppDesign.getAlignment(),
120 1 : children: [
121 3 : TextWrapper(title, style: textTheme.headlineMedium),
122 3 : TextWrapper(description, style: textTheme.numberSmall),
123 : ],
124 : ),
125 : ]
126 : else
127 1 : [
128 1 : Padding(
129 3 : padding: EdgeInsets.fromLTRB(0, indent - 1, 0, indent - 1),
130 3 : child: TextWrapper(title, style: textTheme.headlineMedium),
131 : ),
132 : ],
133 1 : [
134 4 : NumberWidget(details, colorScheme: context.colorScheme, style: textTheme.numberMedium),
135 : ]
136 : ],
137 : ),
138 2 : if (showDivider) ...[
139 : ThemeHelper.hIndent05,
140 4 : BarHorizontalSingle(value: progress, width: width, color: color),
141 : ThemeHelper.hIndent05,
142 : ],
143 : ],
144 : ),
145 : ),
146 : );
147 : }
148 : }
|