Skip to content
Snippets Groups Projects
Commit f5c35651 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Add styled button widget

parent 117f6dfa
No related branches found
No related tags found
1 merge request!69Resolve "Add styled button widget"
Pipeline #6028 passed
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=1.0.55 app.versionName=1.0.56
app.versionCode=56 app.versionCode=57
...@@ -6,7 +6,9 @@ import 'package:random/config/theme.dart'; ...@@ -6,7 +6,9 @@ import 'package:random/config/theme.dart';
import 'package:random/cubit/data_cubit.dart'; import 'package:random/cubit/data_cubit.dart';
import 'package:random/cubit/settings_cubit.dart'; import 'package:random/cubit/settings_cubit.dart';
import 'package:random/ui/widgets/header_app.dart'; import 'package:random/ui/widgets/header_app.dart';
import 'package:random/ui/widgets/styled_button.dart';
import 'package:random/ui/widgets/styles_widget.dart'; import 'package:random/ui/widgets/styles_widget.dart';
import 'package:random/utils/tools.dart';
class DemoPage extends StatelessWidget { class DemoPage extends StatelessWidget {
const DemoPage({super.key}); const DemoPage({super.key});
...@@ -48,6 +50,48 @@ class DemoPage extends StatelessWidget { ...@@ -48,6 +50,48 @@ class DemoPage extends StatelessWidget {
const SizedBox(height: 8), const SizedBox(height: 8),
const AppHeader(text: 'BOTTOM'), const AppHeader(text: 'BOTTOM'),
const SizedBox(height: 8), const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
StyledButton(
caption: 'A',
color: Colors.yellow,
onPressed: () {
printlog('A');
},
),
StyledButton(
caption: '❤️‍🔥',
color: Colors.red,
onPressed: () {
printlog('fire!');
},
),
StyledButton(
caption: '⭐',
color: Colors.green,
onPressed: () {
printlog('star!');
},
),
StyledButton(
caption: '🧁',
color: Colors.blue,
onPressed: () {
printlog('Cupcake');
},
),
],
),
const SizedBox(height: 8),
StyledButton(
caption: 'BUTTON - LARGE',
color: Colors.orange,
onPressed: () {
printlog('large button');
},
),
], ],
), ),
); );
......
import 'package:flutter/material.dart';
import 'package:random/utils/color_extensions.dart';
class StyledButton extends StatelessWidget {
const StyledButton({
super.key,
required this.caption,
required this.color,
required this.onPressed,
});
final String caption;
final Color color;
final VoidCallback? onPressed;
@override
Widget build(BuildContext context) {
const double borderWidth = 4;
final Color borderColor = color.darken(40);
const double borderRadius = 10;
return GestureDetector(
onTap: onPressed,
child: Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: color,
border: Border.all(
color: borderColor,
width: borderWidth,
),
borderRadius: BorderRadius.circular(borderRadius),
),
child: CustomPaint(
painter: StyledButtonPainter(
baseColor: color,
),
child: Center(
child: Text(
caption,
style: TextStyle(
inherit: true,
fontSize: 30,
fontWeight: FontWeight.w900,
color: color.darken(60),
shadows: [
Shadow(
blurRadius: 5.0,
color: color.lighten(60),
offset: const Offset(2, 2),
),
Shadow(
blurRadius: 5.0,
color: color.lighten(60),
offset: const Offset(2, -2),
),
Shadow(
blurRadius: 5.0,
color: color.lighten(60),
offset: const Offset(-2, 2),
),
Shadow(
blurRadius: 5.0,
color: color.lighten(60),
offset: const Offset(-2, -2),
),
],
),
),
),
),
),
);
}
}
class StyledButtonPainter extends CustomPainter {
StyledButtonPainter({
required this.baseColor,
});
final Color baseColor;
@override
void paint(Canvas canvas, Size size) {
final Color lightColor = baseColor.lighten(20);
final Color darkColor = baseColor.darken(20);
final Paint paint = Paint()..style = PaintingStyle.fill;
const double cornerRadius = 6;
Path topPath = Path()
..moveTo(cornerRadius, 0)
..lineTo(size.width - cornerRadius, 0)
..arcToPoint(
Offset(size.width, cornerRadius),
radius: const Radius.circular(cornerRadius),
)
..lineTo(size.width, size.height * .35)
..quadraticBezierTo(
size.width * .4,
size.height * .1,
0,
size.height * .3,
)
..lineTo(0, cornerRadius)
..arcToPoint(
const Offset(cornerRadius, 0),
radius: const Radius.circular(cornerRadius),
);
Path bottomPath = Path()
..moveTo(cornerRadius, size.height)
..lineTo(size.width - cornerRadius, size.height)
..arcToPoint(
Offset(size.width, size.height - cornerRadius),
radius: const Radius.circular(cornerRadius),
clockwise: false,
)
..lineTo(size.width, size.height * .7)
..quadraticBezierTo(
size.width * .6,
size.height * .9,
0,
size.height * .7,
)
..lineTo(0, size.height - cornerRadius)
..arcToPoint(
Offset(cornerRadius, size.height),
radius: const Radius.circular(cornerRadius),
clockwise: false,
);
paint.color = lightColor;
canvas.drawPath(topPath, paint);
paint.color = darkColor;
canvas.drawPath(bottomPath, paint);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => false;
}
...@@ -3,7 +3,7 @@ description: A random application, for testing purpose only. ...@@ -3,7 +3,7 @@ description: A random application, for testing purpose only.
publish_to: "none" publish_to: "none"
version: 1.0.55+56 version: 1.0.56+57
environment: environment:
sdk: "^3.0.0" sdk: "^3.0.0"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment