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

Use flutter_custom_toolbox for common features

parent 759e97a6
No related branches found
No related tags found
1 merge request!25Resolve "Use flutter_custom_toolbox for common features"
Pipeline #6475 passed
Showing
with 20 additions and 316 deletions
import 'package:solitaire/utils/tools.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
class CellLocation { class CellLocation {
final int col; final int col;
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/models/game/board.dart'; import 'package:solitaire/models/game/board.dart';
import 'package:solitaire/models/game/cell.dart'; import 'package:solitaire/models/game/cell.dart';
import 'package:solitaire/models/settings/settings_game.dart'; import 'package:solitaire/models/settings/settings_game.dart';
import 'package:solitaire/models/settings/settings_global.dart'; import 'package:solitaire/models/settings/settings_global.dart';
import 'package:solitaire/utils/tools.dart';
class Game { class Game {
Game({ Game({
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/config/default_game_settings.dart'; import 'package:solitaire/config/default_game_settings.dart';
import 'package:solitaire/utils/tools.dart';
class GameSettings { class GameSettings {
final String layout; final String layout;
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/config/default_global_settings.dart'; import 'package:solitaire/config/default_global_settings.dart';
import 'package:solitaire/utils/tools.dart';
class GlobalSettings { class GlobalSettings {
String skin; String skin;
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/cubit/game_cubit.dart'; import 'package:solitaire/cubit/game_cubit.dart';
import 'package:solitaire/models/game/game.dart'; import 'package:solitaire/models/game/game.dart';
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/cubit/game_cubit.dart'; import 'package:solitaire/cubit/game_cubit.dart';
import 'package:solitaire/models/game/game.dart'; import 'package:solitaire/models/game/game.dart';
......
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
class AppHeader extends StatelessWidget {
const AppHeader({super.key, required this.text});
final String text;
@override
Widget build(BuildContext context) {
return Text(
tr(text),
textAlign: TextAlign.start,
style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
);
}
}
class AppTitle extends StatelessWidget {
const AppTitle({super.key, required this.text});
final String text;
@override
Widget build(BuildContext context) {
return Text(
tr(text),
textAlign: TextAlign.start,
style: Theme.of(context).textTheme.titleLarge!.apply(fontWeightDelta: 2),
);
}
}
import 'package:flutter/material.dart';
import 'package:solitaire/utils/color_extensions.dart';
class OutlinedText extends StatelessWidget {
const OutlinedText({
super.key,
required this.text,
required this.fontSize,
required this.textColor,
this.outlineColor,
});
final String text;
final double fontSize;
final Color textColor;
final Color? outlineColor;
@override
Widget build(BuildContext context) {
final double delta = fontSize / 30;
return Text(
text,
style: TextStyle(
inherit: true,
fontSize: fontSize,
fontWeight: FontWeight.w600,
color: textColor,
shadows: [
Shadow(
offset: Offset(-delta, -delta),
color: outlineColor ?? textColor.darken(),
),
Shadow(
offset: Offset(delta, -delta),
color: outlineColor ?? textColor.darken(),
),
Shadow(
offset: Offset(delta, delta),
color: outlineColor ?? textColor.darken(),
),
Shadow(
offset: Offset(-delta, delta),
color: outlineColor ?? textColor.darken(),
),
],
),
);
}
}
import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter/material.dart';
import 'package:solitaire/utils/color_extensions.dart';
class StyledButton extends StatelessWidget {
const StyledButton({
super.key,
required this.color,
required this.onPressed,
this.onLongPress,
required this.child,
});
final Color color;
final VoidCallback? onPressed;
final VoidCallback? onLongPress;
final Widget child;
factory StyledButton.text({
Key? key,
required VoidCallback? onPressed,
VoidCallback? onLongPress,
required String caption,
required Color color,
}) {
final Widget captionWidget = AutoSizeText(
caption,
maxLines: 1,
style: TextStyle(
inherit: true,
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),
),
],
),
);
return StyledButton(
color: color,
onPressed: onPressed,
onLongPress: onLongPress,
child: captionWidget,
);
}
factory StyledButton.icon({
Key? key,
required VoidCallback? onPressed,
VoidCallback? onLongPress,
required Icon icon,
required Color color,
required double iconSize,
}) {
return StyledButton(
color: color,
onPressed: onPressed,
onLongPress: onLongPress,
child: Icon(
icon.icon,
color: icon.color ?? color.darken(60),
size: iconSize,
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),
),
],
),
);
}
@override
Widget build(BuildContext context) {
const double borderWidth = 4;
final Color borderColor = color.darken(40);
const double borderRadius = 10;
return Container(
margin: const EdgeInsets.all(2),
padding: const EdgeInsets.all(2),
decoration: BoxDecoration(
color: color,
border: Border.all(
color: borderColor,
width: borderWidth,
),
borderRadius: BorderRadius.circular(borderRadius),
),
child: CustomPaint(
painter: StyledButtonPainter(
baseColor: color,
),
child: MaterialButton(
onPressed: onPressed,
onLongPress: onLongPress,
padding: const EdgeInsets.all(8),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
minWidth: 40,
child: child,
),
),
);
}
}
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;
}
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/cubit/game_cubit.dart'; import 'package:solitaire/cubit/game_cubit.dart';
import 'package:solitaire/models/game/game.dart'; import 'package:solitaire/models/game/game.dart';
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/config/default_game_settings.dart'; import 'package:solitaire/config/default_game_settings.dart';
import 'package:solitaire/config/default_global_settings.dart'; import 'package:solitaire/config/default_global_settings.dart';
......
import 'dart:math'; import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/config/default_game_settings.dart'; import 'package:solitaire/config/default_game_settings.dart';
import 'package:solitaire/data/game_data.dart'; import 'package:solitaire/data/game_data.dart';
...@@ -9,7 +10,6 @@ import 'package:solitaire/models/game/cell.dart'; ...@@ -9,7 +10,6 @@ import 'package:solitaire/models/game/cell.dart';
import 'package:solitaire/models/game/cell_location.dart'; import 'package:solitaire/models/game/cell_location.dart';
import 'package:solitaire/models/settings/settings_game.dart'; import 'package:solitaire/models/settings/settings_game.dart';
import 'package:solitaire/models/settings/settings_global.dart'; import 'package:solitaire/models/settings/settings_global.dart';
import 'package:solitaire/utils/tools.dart';
class ParameterPainter extends CustomPainter { class ParameterPainter extends CustomPainter {
const ParameterPainter({ const ParameterPainter({
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/config/default_game_settings.dart'; import 'package:solitaire/config/default_game_settings.dart';
import 'package:solitaire/config/default_global_settings.dart'; import 'package:solitaire/config/default_global_settings.dart';
import 'package:solitaire/models/settings/settings_game.dart'; import 'package:solitaire/models/settings/settings_game.dart';
import 'package:solitaire/models/settings/settings_global.dart'; import 'package:solitaire/models/settings/settings_global.dart';
import 'package:solitaire/ui/helpers/styled_button.dart';
import 'package:solitaire/ui/parameters/parameter_painter.dart'; import 'package:solitaire/ui/parameters/parameter_painter.dart';
import 'package:solitaire/utils/tools.dart';
class ParameterWidget extends StatelessWidget { class ParameterWidget extends StatelessWidget {
const ParameterWidget({ const ParameterWidget({
......
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/ui/helpers/app_titles.dart';
class PageAbout extends StatelessWidget { class PageAbout extends StatelessWidget {
const PageAbout({super.key}); const PageAbout({super.key});
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/cubit/game_cubit.dart'; import 'package:solitaire/cubit/game_cubit.dart';
import 'package:solitaire/models/game/game.dart'; import 'package:solitaire/models/game/game.dart';
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/ui/helpers/app_titles.dart';
import 'package:solitaire/ui/settings/settings_form.dart'; import 'package:solitaire/ui/settings/settings_form.dart';
class PageSettings extends StatelessWidget { class PageSettings extends StatelessWidget {
......
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:unicons/unicons.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/ui/settings/theme_card.dart'; import 'package:solitaire/ui/settings/theme_card.dart';
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/cubit/theme_cubit.dart'; import 'package:solitaire/cubit/theme_cubit.dart';
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/config/menu.dart'; import 'package:solitaire/config/menu.dart';
import 'package:solitaire/cubit/nav_cubit.dart'; import 'package:solitaire/cubit/nav_cubit.dart';
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/cubit/game_cubit.dart'; import 'package:solitaire/cubit/game_cubit.dart';
import 'package:solitaire/ui/helpers/styled_button.dart';
class DeleteSavedGameButton extends StatelessWidget { class DeleteSavedGameButton extends StatelessWidget {
const DeleteSavedGameButton({super.key}); const DeleteSavedGameButton({super.key});
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment