Skip to content

Commit 37134ec

Browse files
Merge pull request #6 from AhmedAbdoElhawary/feature/sorting
Feature/sorting
2 parents 7806571 + fcc752b commit 37134ec

File tree

19 files changed

+763
-145
lines changed

19 files changed

+763
-145
lines changed

lib/config/routes/route_app.dart

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
import 'package:algorithm_visualizer/core/helpers/app_bar/app_bar.dart';
22
import 'package:algorithm_visualizer/core/resources/strings_manager.dart';
33
import 'package:algorithm_visualizer/core/widgets/adaptive/text/adaptive_text.dart';
4-
import 'package:algorithm_visualizer/features/grid/view/grid_page.dart';
4+
import 'package:algorithm_visualizer/features/base/view/base_page.dart';
5+
import 'package:algorithm_visualizer/features/searching/view/grid_page.dart';
6+
import 'package:algorithm_visualizer/features/sorting/view/sorting_page.dart';
57
import 'package:flutter/material.dart';
68
import 'package:go_router/go_router.dart';
79

810
class Routes {
9-
static const RouteConfig grid = RouteConfig(
10-
name: 'grid',
11+
static const RouteConfig base = RouteConfig(
12+
name: 'base',
1113
path: '/',
1214
);
13-
14-
// name: 'hashtag',
15-
// path: '/hashtag/:hashtagId',
16-
// pathParamsName: "hashtagId",
17-
// queryParamsName: 'mid',
15+
static const RouteConfig searching = RouteConfig(
16+
name: 'searching',
17+
path: '/searching',
18+
);
19+
static const RouteConfig sorting = RouteConfig(
20+
name: 'sorting',
21+
path: '/sorting',
22+
);
1823
}
1924

2025
class RouteConfig {
@@ -34,18 +39,30 @@ class RouteConfig {
3439
class AppRoutes {
3540
static final router = GoRouter(
3641
debugLogDiagnostics: true,
37-
initialLocation: Routes.grid.path,
42+
initialLocation: Routes.base.path,
3843
errorBuilder: (context, state) => const _UnknownPage(),
3944
routes: [
4045
ShellRoute(
4146
builder: (context, state, child) {
4247
return child;
4348
},
49+
4450
routes: [
51+
52+
GoRoute(
53+
path: Routes.base.path,
54+
name: Routes.base.name,
55+
builder: (context, state) => const BasePage(),
56+
),
57+
GoRoute(
58+
path: Routes.searching.path,
59+
name: Routes.searching.name,
60+
builder: (context, state) => const SearchingPage(),
61+
),
4562
GoRoute(
46-
path: Routes.grid.path,
47-
name: Routes.grid.name,
48-
builder: (context, state) => const GridPage(),
63+
path: Routes.sorting.path,
64+
name: Routes.sorting.name,
65+
builder: (context, state) => const SortingPage(),
4966
),
5067
],
5168
),

lib/core/helpers/random_int.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import 'dart:math';
2+
3+
class CustomRandom {
4+
static List<int> generateList(int maxNum, int length) {
5+
if (length > maxNum + 1) length = maxNum;
6+
7+
List<int> numbers = List<int>.generate(maxNum + 1, (index) => index);
8+
9+
numbers.shuffle(Random());
10+
11+
return numbers.sublist(0, length);
12+
}
13+
}

lib/core/helpers/screen_size.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import 'package:flutter/material.dart';
2+
3+
class ScreenSize {
4+
static BuildContext? context;
5+
static initContext(BuildContext? ctx) {
6+
context = ctx;
7+
}
8+
}

lib/core/resources/strings_manager.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ class StringsManager {
2424
static const String unknownPage = "Unknown page";
2525
static const String notInitializeGridYet = "Not initialize grid yet.";
2626
static const String clear = "Clear";
27+
static const String clearAll = "Clear all";
28+
static const String clearPath = "Clear path";
2729
static const String generateMaze = "Generate maze";
30+
static const String searching = "Searching";
31+
static const String sorting = "Sorting";
32+
static const String stop = "Stop";
33+
static const String play = "Play";
34+
static const String reset = "Reset";
2835

2936
}

lib/core/widgets/adaptive/text/regular_text.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class RegularText extends _AdaptiveText {
66
super.fontSize = 16,
77
super.decoration = TextDecoration.none,
88
super.fontStyle = FontStyle.normal,
9-
super.color,
9+
super.color = ThemeEnum.focusColor,
1010
super.shadows,
1111
super.maxLines = 2,
1212
super.textAlign,
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import 'package:algorithm_visualizer/core/extensions/navigators.dart';
2+
import 'package:algorithm_visualizer/core/resources/theme_manager.dart';
3+
import 'package:algorithm_visualizer/core/widgets/adaptive/text/adaptive_text.dart';
4+
import 'package:algorithm_visualizer/core/widgets/custom_widgets/custom_divider.dart';
5+
import 'package:flutter/material.dart';
6+
import 'package:flutter_screenutil/flutter_screenutil.dart';
7+
8+
const double _borderRadius = 15;
9+
10+
class ListDialogParameters {
11+
final String text;
12+
final VoidCallback onTap;
13+
final ThemeEnum? color;
14+
ListDialogParameters({
15+
required this.text,
16+
required this.onTap,
17+
this.color,
18+
});
19+
}
20+
21+
class CustomAlertDialog {
22+
final BuildContext context;
23+
CustomAlertDialog(this.context);
24+
25+
Future<bool?> solidDialog(
26+
{required List<ListDialogParameters> parameters, bool barrierDismissible = true}) {
27+
return showDialog<bool>(
28+
context: context,
29+
barrierDismissible: barrierDismissible,
30+
builder: (context) {
31+
return AlertDialog(
32+
contentPadding: const EdgeInsetsDirectional.all(0),
33+
shape: RoundedRectangleBorder(
34+
borderRadius: BorderRadius.circular(_borderRadius.r),
35+
),
36+
content: _SolidContent(parameters),
37+
);
38+
},
39+
);
40+
}
41+
}
42+
43+
class _SolidContent extends StatelessWidget {
44+
const _SolidContent(this.parameters);
45+
final List<ListDialogParameters> parameters;
46+
@override
47+
Widget build(BuildContext context) {
48+
return Column(
49+
mainAxisSize: MainAxisSize.min,
50+
children: [
51+
...List.generate(
52+
parameters.length,
53+
(index) {
54+
final isLast = index == parameters.length - 1;
55+
return Column(
56+
mainAxisSize: MainAxisSize.min,
57+
children: [
58+
InkWell(
59+
borderRadius: index == 0
60+
? BorderRadius.only(
61+
topLeft: Radius.circular(_borderRadius.r),
62+
topRight: Radius.circular(_borderRadius.r),
63+
)
64+
: (isLast
65+
? BorderRadius.only(
66+
bottomLeft: Radius.circular(_borderRadius.r),
67+
bottomRight: Radius.circular(_borderRadius.r),
68+
)
69+
: null),
70+
onTap: () {
71+
parameters[index].onTap();
72+
context.pop();
73+
},
74+
child: SizedBox(
75+
width: double.infinity,
76+
child: Column(
77+
mainAxisSize: MainAxisSize.min,
78+
children: [
79+
Padding(
80+
padding: REdgeInsets.symmetric(vertical: 10),
81+
child: RegularText(parameters[index].text,
82+
color: parameters[index].color ?? ThemeEnum.focusColor),
83+
),
84+
],
85+
),
86+
),
87+
),
88+
if (!isLast) const CustomDivider(withHeight: false, color: ThemeEnum.whiteD4Color),
89+
],
90+
);
91+
},
92+
),
93+
],
94+
);
95+
}
96+
}

lib/core/widgets/custom_widgets/custom_rounded_elevated_button.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ class CustomRoundedElevatedButton extends StatelessWidget {
99
final Widget child;
1010
final VoidCallback onPressed;
1111
final bool fitToContent;
12-
final bool smallRounded;
12+
final double roundedRadius;
1313
final double fixedSize;
1414
const CustomRoundedElevatedButton({
1515
super.key,
1616
this.backgroundColor = ThemeEnum.focusColor,
1717
this.shadowColor = ThemeEnum.transparentColor,
1818
this.fitToContent = true,
19-
this.smallRounded = false,
19+
this.roundedRadius = 50,
2020
this.fixedSize = 35,
2121
required this.child,
2222
required this.onPressed,
@@ -37,7 +37,7 @@ class CustomRoundedElevatedButton extends StatelessWidget {
3737
fixedSize: fitToContent ? Size.fromHeight(fixedSize.r) : null,
3838
padding: EdgeInsets.symmetric(horizontal: 15.r),
3939
shape: RoundedRectangleBorder(
40-
borderRadius: BorderRadius.circular(smallRounded ? 10 : 50).r),
40+
borderRadius: BorderRadius.circular(roundedRadius).r),
4141
surfaceTintColor: background,
4242
foregroundColor: context.getColor(ThemeEnum.hintColor),
4343
),
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import 'package:algorithm_visualizer/config/routes/route_app.dart';
2+
import 'package:algorithm_visualizer/core/extensions/navigators.dart';
3+
import 'package:algorithm_visualizer/core/helpers/screen_size.dart';
4+
import 'package:algorithm_visualizer/core/resources/strings_manager.dart';
5+
import 'package:algorithm_visualizer/core/resources/theme_manager.dart';
6+
import 'package:algorithm_visualizer/core/widgets/adaptive/text/adaptive_text.dart';
7+
import 'package:algorithm_visualizer/core/widgets/custom_widgets/custom_rounded_elevated_button.dart';
8+
import 'package:flutter/material.dart';
9+
10+
class BasePage extends StatefulWidget {
11+
const BasePage({super.key});
12+
13+
@override
14+
State<BasePage> createState() => _BasePageState();
15+
}
16+
17+
class _BasePageState extends State<BasePage> {
18+
@override
19+
void initState() {
20+
WidgetsBinding.instance.addPostFrameCallback((_) {
21+
ScreenSize.initContext(context);
22+
});
23+
super.initState();
24+
}
25+
26+
@override
27+
Widget build(BuildContext context) {
28+
return Scaffold(
29+
body: SafeArea(
30+
child: Center(
31+
child: Row(
32+
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
33+
children: [
34+
CustomRoundedElevatedButton(
35+
roundedRadius: 3,
36+
backgroundColor: ThemeEnum.whiteD5Color,
37+
child: const RegularText(StringsManager.searching),
38+
onPressed: () {
39+
context.pushTo(Routes.searching);
40+
},
41+
),
42+
CustomRoundedElevatedButton(
43+
roundedRadius: 3,
44+
backgroundColor: ThemeEnum.whiteD5Color,
45+
child: const RegularText(StringsManager.sorting),
46+
onPressed: () {
47+
context.pushTo(Routes.sorting);
48+
},
49+
),
50+
],
51+
),
52+
),
53+
),
54+
);
55+
}
56+
}

0 commit comments

Comments
 (0)