Skip to content

Commit 109ae09

Browse files
author
Vivek Chib
committed
replaced curveEnum with model class
1 parent ba3f569 commit 109ae09

File tree

8 files changed

+407
-17
lines changed

8 files changed

+407
-17
lines changed

lib/model/curve_model.dart

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
import 'package:equatable/equatable.dart';
2+
import 'package:flutter/material.dart';
3+
4+
class CurveModel extends Equatable {
5+
final Curve curve;
6+
final String code;
7+
final String name;
8+
final bool isCustom;
9+
10+
const CurveModel({
11+
required this.curve,
12+
required this.code,
13+
required this.name,
14+
this.isCustom = false,
15+
});
16+
17+
@override
18+
List<Object?> get props => [isCustom, name];
19+
20+
static Map<String, List<CurveModel>> get list => {
21+
'ease': easeCurves,
22+
'bounces': bounceCurves,
23+
'elastics': elasticCurves,
24+
'others': otherCurves,
25+
};
26+
27+
CurveModel copyWith({
28+
Curve? curve,
29+
String? code,
30+
String? name,
31+
bool? isCustom,
32+
}) {
33+
return CurveModel(
34+
curve: curve ?? this.curve,
35+
code: code ?? this.code,
36+
name: name ?? this.name,
37+
isCustom: isCustom ?? this.isCustom,
38+
);
39+
}
40+
}
41+
42+
final easeCurves = [
43+
CurveModel(curve: Curves.ease, code: "Curves.ease", name: "ease"),
44+
CurveModel(curve: Curves.easeIn, code: "Curves.easeIn", name: "easeIn"),
45+
CurveModel(
46+
curve: Curves.easeInToLinear,
47+
code: "Curves.easeInToLinear",
48+
name: "easeInToLinear"),
49+
CurveModel(
50+
curve: Curves.easeInSine, code: "Curves.easeInSine", name: "easeInSine"),
51+
CurveModel(
52+
curve: Curves.easeInQuad, code: "Curves.easeInQuad", name: "easeInQuad"),
53+
CurveModel(
54+
curve: Curves.easeInCubic,
55+
code: "Curves.easeInCubic",
56+
name: "easeInCubic"),
57+
CurveModel(
58+
curve: Curves.easeInQuart,
59+
code: "Curves.easeInQuart",
60+
name: "easeInQuart"),
61+
CurveModel(
62+
curve: Curves.easeInQuint,
63+
code: "Curves.easeInQuint",
64+
name: "easeInQuint"),
65+
CurveModel(
66+
curve: Curves.easeInExpo, code: "Curves.easeInExpo", name: "easeInExpo"),
67+
CurveModel(
68+
curve: Curves.easeInCirc, code: "Curves.easeInCirc", name: "easeInCirc"),
69+
CurveModel(
70+
curve: Curves.easeInBack, code: "Curves.easeInBack", name: "easeInBack"),
71+
CurveModel(curve: Curves.easeOut, code: "Curves.easeOut", name: "easeOut"),
72+
CurveModel(
73+
curve: Curves.linearToEaseOut,
74+
code: "Curves.linearToEaseOut",
75+
name: "linearToEaseOut"),
76+
CurveModel(
77+
curve: Curves.easeOutSine,
78+
code: "Curves.easeOutSine",
79+
name: "easeOutSine"),
80+
CurveModel(
81+
curve: Curves.easeOutQuad,
82+
code: "Curves.easeOutQuad",
83+
name: "easeOutQuad"),
84+
CurveModel(
85+
curve: Curves.easeOutCubic,
86+
code: "Curves.easeOutCubic",
87+
name: "easeOutCubic"),
88+
CurveModel(
89+
curve: Curves.easeOutQuart,
90+
code: "Curves.easeOutQuart",
91+
name: "easeOutQuart"),
92+
CurveModel(
93+
curve: Curves.easeOutQuint,
94+
code: "Curves.easeOutQuint",
95+
name: "easeOutQuint"),
96+
CurveModel(
97+
curve: Curves.easeOutExpo,
98+
code: "Curves.easeOutExpo",
99+
name: "easeOutExpo"),
100+
CurveModel(
101+
curve: Curves.easeOutCirc,
102+
code: "Curves.easeOutCirc",
103+
name: "easeOutCirc"),
104+
CurveModel(
105+
curve: Curves.easeOutBack,
106+
code: "Curves.easeOutBack",
107+
name: "easeOutBack"),
108+
CurveModel(
109+
curve: Curves.easeInOut, code: "Curves.easeInOut", name: "easeInOut"),
110+
CurveModel(
111+
curve: Curves.easeInOutSine,
112+
code: "Curves.easeInOutSine",
113+
name: "easeInOutSine"),
114+
CurveModel(
115+
curve: Curves.easeInOutQuad,
116+
code: "Curves.easeInOutQuad",
117+
name: "easeInOutQuad"),
118+
CurveModel(
119+
curve: Curves.easeInOutCubic,
120+
code: "Curves.easeInOutCubic",
121+
name: "easeInOutCubic"),
122+
CurveModel(
123+
curve: Curves.easeInOutCubicEmphasized,
124+
code: "Curves.easeInOutCubicEmphasized",
125+
name: "easeInOutCubicEmphasized"),
126+
CurveModel(
127+
curve: Curves.easeInOutQuart,
128+
code: "Curves.easeInOutQuart",
129+
name: "easeInOutQuart"),
130+
CurveModel(
131+
curve: Curves.easeInOutQuint,
132+
code: "Curves.easeInOutQuint",
133+
name: "easeInOutQuint"),
134+
CurveModel(
135+
curve: Curves.easeInOutExpo,
136+
code: "Curves.easeInOutExpo",
137+
name: "easeInOutExpo"),
138+
CurveModel(
139+
curve: Curves.easeInOutCirc,
140+
code: "Curves.easeInOutCirc",
141+
name: "easeInOutCirc"),
142+
CurveModel(
143+
curve: Curves.easeInOutBack,
144+
code: "Curves.easeInOutBack",
145+
name: "easeInOutBack"),
146+
];
147+
148+
final bounceCurves = [
149+
CurveModel(
150+
curve: Curves.bounceIn,
151+
code: "Curves.bounceIn",
152+
name: "bounceIn",
153+
),
154+
CurveModel(
155+
curve: Curves.bounceOut,
156+
code: "Curves.bounceOut",
157+
name: "bounceOut",
158+
),
159+
CurveModel(
160+
curve: Curves.bounceInOut,
161+
code: "Curves.bounceInOut",
162+
name: "bounceInOut",
163+
),
164+
];
165+
166+
final elasticCurves = [
167+
CurveModel(
168+
curve: Curves.elasticIn,
169+
code: "Curves.elasticIn",
170+
name: "elasticIn",
171+
),
172+
CurveModel(
173+
curve: Curves.elasticOut,
174+
code: "Curves.elasticOut",
175+
name: "elasticOut",
176+
),
177+
CurveModel(
178+
curve: Curves.elasticInOut,
179+
code: "Curves.elasticInOut",
180+
name: "elasticInOut",
181+
),
182+
];
183+
184+
final otherCurves = [
185+
CurveModel(
186+
curve: Curves.linear,
187+
code: "Curves.linear",
188+
name: "linear",
189+
),
190+
CurveModel(
191+
curve: Curves.decelerate,
192+
code: "Curves.decelerate",
193+
name: "decelerate",
194+
),
195+
CurveModel(
196+
curve: Curves.slowMiddle,
197+
code: "Curves.slowMiddle",
198+
name: "slowMiddle",
199+
),
200+
CurveModel(
201+
curve: Curves.fastOutSlowIn,
202+
code: "Curves.fastOutSlowIn",
203+
name: "fastOutSlowIn",
204+
),
205+
CurveModel(
206+
curve: Curves.fastEaseInToSlowEaseOut,
207+
code: "Curves.fastEaseInToSlowEaseOut",
208+
name: "fastEaseInToSlowEaseOut",
209+
),
210+
CurveModel(
211+
curve: Curves.fastLinearToSlowEaseIn,
212+
code: "Curves.fastLinearToSlowEaseIn",
213+
name: "fastLinearToSlowEaseIn",
214+
),
215+
// CurveModel(
216+
// curve: Cubic(.5, 0, .5, 1),
217+
// code: "Cubic(.5, 0, .5, 1)",
218+
// name: "custom",
219+
// isCustom: true,
220+
// ),
221+
];

lib/utils/curves_enum.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ enum CurvesEnum {
4444
elasticIn(Curves.elasticIn),
4545
elasticOut(Curves.elasticOut),
4646
elasticInOut(Curves.elasticInOut),
47-
custom(Cubic(0.48, 1.26, 0.41, 0.6));
47+
custom(Cubic(.5, 0, .5, 1));
4848

4949
final Curve curve;
5050

@@ -111,5 +111,8 @@ final otherCurves = [
111111
CurvesEnum.linear,
112112
CurvesEnum.decelerate,
113113
CurvesEnum.slowMiddle,
114-
//CurvesEnum.custom,
114+
CurvesEnum.fastOutSlowIn,
115+
CurvesEnum.fastEaseInToSlowEaseOut,
116+
CurvesEnum.fastLinearToSlowEaseIn,
117+
CurvesEnum.custom,
115118
];

lib/views/home_page.dart

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_animate/flutter_animate.dart';
3+
import 'package:flutter_curve_visualizer/model/curve_model.dart';
24
import 'package:flutter_curve_visualizer/views/widgets/screen_mode.dart';
35
import 'package:flutter_curve_visualizer/utils/curves_enum.dart';
46
import 'package:flutter_curve_visualizer/views/widgets/appbar.dart';
57
import 'package:flutter_curve_visualizer/views/widgets/dropdown_menu.dart';
68
import 'package:flutter_curve_visualizer/views/widgets/graph/graph_widget.dart';
79
import 'widgets/animated_box/animated_boxes.dart';
810
import 'widgets/code_block.dart';
11+
import 'widgets/cubic_curve_input_widget.dart';
912

1013
class HomePage extends StatefulWidget {
1114
const HomePage({super.key});
@@ -20,15 +23,34 @@ class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
2023
late CurvedAnimation curveAnimation;
2124

2225
late String selectedCategory;
23-
late CurvesEnum selectedCurve;
26+
late CurveModel selectedCurve;
27+
28+
late List<TextEditingController> customCubicControllers;
2429

2530
late int animationTime;
2631

2732
@override
2833
void initState() {
2934
super.initState();
30-
selectedCategory = CurvesEnum.list.keys.first;
31-
selectedCurve = CurvesEnum.list.values.first.first;
35+
36+
for (final list in CurveModel.list.values) {
37+
debugPrint(list.length.toString());
38+
}
39+
40+
customCubicControllers = List.generate(4, (index) {
41+
final value = switch (index) {
42+
0 => "0.5",
43+
1 => "0",
44+
2 => "0.75",
45+
3 => "1",
46+
int() => throw UnimplementedError(),
47+
};
48+
49+
return TextEditingController(text: value);
50+
});
51+
52+
selectedCategory = CurveModel.list.keys.first;
53+
selectedCurve = CurveModel.list.values.first.first;
3254

3355
animationTime = 2;
3456

@@ -50,6 +72,10 @@ class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
5072

5173
@override
5274
void dispose() {
75+
for (final controller in customCubicControllers) {
76+
controller.dispose();
77+
}
78+
5379
playPauseController.dispose();
5480
controller.dispose();
5581
super.dispose();
@@ -60,15 +86,15 @@ class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
6086

6187
setState(() {
6288
selectedCategory = category;
63-
selectedCurve = CurvesEnum.list[category]!.first;
89+
selectedCurve = CurveModel.list[category]!.first;
6490
curveAnimation = CurvedAnimation(
6591
parent: controller,
6692
curve: selectedCurve.curve,
6793
);
6894
});
6995
}
7096

71-
void updateCurve(CurvesEnum curve) {
97+
void updateCurve(CurveModel curve) {
7298
if (curve == selectedCurve) return;
7399

74100
setState(() {
@@ -145,7 +171,7 @@ class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
145171
spacing: spacing,
146172
children: [
147173
// Code block
148-
CodeBlock(curve: selectedCurve),
174+
CodeBlock(code: selectedCurve.code),
149175

150176
// Curve selector
151177
Row(
@@ -166,10 +192,10 @@ class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
166192
// Curve type
167193
Flexible(
168194
flex: 2,
169-
child: DropdownMenuWidget<CurvesEnum>(
195+
child: DropdownMenuWidget<CurveModel>(
170196
title: "Type",
171197
value: selectedCurve,
172-
items: CurvesEnum.list[selectedCategory]!..toList(),
198+
items: CurveModel.list[selectedCategory]!.toList(),
173199
onChanged: (value) => updateCurve(value!),
174200
childBuilder: (context, value, textStyle) {
175201
return Text(value.name.toString(), style: textStyle);
@@ -202,6 +228,24 @@ class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
202228
],
203229
),
204230
),
231+
232+
// TODO : TextField have some issues with current flutter version, waiting it to be fixed
233+
Visibility(
234+
visible: false,
235+
child: AnimatedSize(
236+
curve: Curves.fastOutSlowIn,
237+
duration: 200.ms,
238+
reverseDuration: 200.ms,
239+
child: (selectedCurve.isCustom)
240+
? CubicCurveInputWidget(
241+
controllers: customCubicControllers,
242+
onApply: (curve) {
243+
updateCurve(selectedCurve.copyWith(curve: curve));
244+
},
245+
)
246+
: const SizedBox.shrink(),
247+
),
248+
)
205249
],
206250
),
207251
);

lib/views/widgets/code_block.dart

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter/services.dart';
33
import 'package:flutter_curve_visualizer/views/widgets/screen_mode.dart';
4-
import 'package:flutter_curve_visualizer/utils/curves_enum.dart';
54

65
class CodeBlock extends StatelessWidget {
7-
final CurvesEnum curve;
6+
final String code;
87

9-
CodeBlock({super.key, CurvesEnum? curve})
10-
: curve = curve ?? CurvesEnum.values.first;
8+
const CodeBlock({super.key, required this.code});
119

1210
void copyCode(BuildContext context, String code) {
1311
Clipboard.setData(ClipboardData(text: code));
@@ -39,8 +37,6 @@ class CodeBlock extends StatelessWidget {
3937
Color(0xff2bc542),
4038
];
4139

42-
final code = "Curve.${curve.name}";
43-
4440
return Container(
4541
padding: EdgeInsets.all(8.0),
4642
decoration: BoxDecoration(

0 commit comments

Comments
 (0)