Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
Loading items

Target

Select target project
0 results Searching
Select Git revision
Loading items
Show changes
46 files
+ 108
579
Compare changes
  • Side-by-side
  • Inline

Files

.editorconfig

0 → 100644
+18 −0
Original line number Diff line number Diff line
root = true

[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.json]
indent_size = 2

[*.yaml]
indent_size = 2

[*.md]
trim_trailing_whitespace = false
+11 −2
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
.buildlog/
.history
.svn/
migrate_working_dir/

# IntelliJ related
*.iml
@@ -33,5 +34,13 @@
# Web related
lib/generated_plugin_registrant.dart

# Exceptions to above rules.
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release

assets/fonts/Nunito-Bold.ttf

deleted100644 → 0
−129 KiB

File deleted.

assets/fonts/Nunito-Light.ttf

deleted100644 → 0
−129 KiB

File deleted.

assets/fonts/Nunito-Medium.ttf

deleted100644 → 0
−129 KiB

File deleted.

assets/fonts/Nunito-Regular.ttf

deleted100644 → 0
−129 KiB

File deleted.

+1 −0
Original line number Diff line number Diff line
Use flutter_custom_toolbox for common features.
+1 −0
Original line number Diff line number Diff line
Utilisation de flutter_custom_toolbox pour les fonctionnalités communes.
+1 −1
Original line number Diff line number Diff line
import 'package:puissance4/utils/tools.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

class DefaultGameSettings {
  // available game parameters codes
+1 −1
Original line number Diff line number Diff line
import 'package:puissance4/utils/tools.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

class DefaultGlobalSettings {
  // available global parameters codes
+1 −1
Original line number Diff line number Diff line
import 'package:flutter/material.dart';
import 'package:unicons/unicons.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/ui/screens/page_about.dart';
import 'package:puissance4/ui/screens/page_game.dart';

lib/config/theme.dart

deleted100644 → 0
+0 −190
Original line number Diff line number Diff line
import 'package:flutter/material.dart';

/// Colors from Tailwind CSS (v3.0) - June 2022
///
/// https://tailwindcss.com/docs/customizing-colors

const int _primaryColor = 0xFF6366F1;
const MaterialColor primarySwatch = MaterialColor(_primaryColor, <int, Color>{
  50: Color(0xFFEEF2FF), // indigo-50
  100: Color(0xFFE0E7FF), // indigo-100
  200: Color(0xFFC7D2FE), // indigo-200
  300: Color(0xFFA5B4FC), // indigo-300
  400: Color(0xFF818CF8), // indigo-400
  500: Color(_primaryColor), // indigo-500
  600: Color(0xFF4F46E5), // indigo-600
  700: Color(0xFF4338CA), // indigo-700
  800: Color(0xFF3730A3), // indigo-800
  900: Color(0xFF312E81), // indigo-900
});

const int _textColor = 0xFF64748B;
const MaterialColor textSwatch = MaterialColor(_textColor, <int, Color>{
  50: Color(0xFFF8FAFC), // slate-50
  100: Color(0xFFF1F5F9), // slate-100
  200: Color(0xFFE2E8F0), // slate-200
  300: Color(0xFFCBD5E1), // slate-300
  400: Color(0xFF94A3B8), // slate-400
  500: Color(_textColor), // slate-500
  600: Color(0xFF475569), // slate-600
  700: Color(0xFF334155), // slate-700
  800: Color(0xFF1E293B), // slate-800
  900: Color(0xFF0F172A), // slate-900
});

const Color errorColor = Color(0xFFDC2626); // red-600

final ColorScheme lightColorScheme = ColorScheme.light(
  primary: primarySwatch.shade500,
  secondary: primarySwatch.shade500,
  onSecondary: Colors.white,
  error: errorColor,
  onSurface: textSwatch.shade500,
  surface: textSwatch.shade50,
  surfaceContainerHighest: Colors.white,
  shadow: textSwatch.shade900.withOpacity(.1),
);

final ColorScheme darkColorScheme = ColorScheme.dark(
  primary: primarySwatch.shade500,
  secondary: primarySwatch.shade500,
  onSecondary: Colors.white,
  error: errorColor,
  onSurface: textSwatch.shade300,
  surface: const Color(0xFF262630),
  surfaceContainerHighest: const Color(0xFF282832),
  shadow: textSwatch.shade900.withOpacity(.2),
);

final ThemeData lightTheme = ThemeData(
  colorScheme: lightColorScheme,
  fontFamily: 'Nunito',
  textTheme: TextTheme(
    displayLarge: TextStyle(
      color: textSwatch.shade700,
      fontFamily: 'Nunito',
    ),
    displayMedium: TextStyle(
      color: textSwatch.shade600,
      fontFamily: 'Nunito',
    ),
    displaySmall: TextStyle(
      color: textSwatch.shade500,
      fontFamily: 'Nunito',
    ),
    headlineLarge: TextStyle(
      color: textSwatch.shade700,
      fontFamily: 'Nunito',
    ),
    headlineMedium: TextStyle(
      color: textSwatch.shade600,
      fontFamily: 'Nunito',
    ),
    headlineSmall: TextStyle(
      color: textSwatch.shade500,
      fontFamily: 'Nunito',
    ),
    titleLarge: TextStyle(
      color: textSwatch.shade700,
      fontFamily: 'Nunito',
    ),
    titleMedium: TextStyle(
      color: textSwatch.shade600,
      fontFamily: 'Nunito',
    ),
    titleSmall: TextStyle(
      color: textSwatch.shade500,
      fontFamily: 'Nunito',
    ),
    bodyLarge: TextStyle(
      color: textSwatch.shade700,
      fontFamily: 'Nunito',
    ),
    bodyMedium: TextStyle(
      color: textSwatch.shade600,
      fontFamily: 'Nunito',
    ),
    bodySmall: TextStyle(
      color: textSwatch.shade500,
      fontFamily: 'Nunito',
    ),
    labelLarge: TextStyle(
      color: textSwatch.shade700,
      fontFamily: 'Nunito',
    ),
    labelMedium: TextStyle(
      color: textSwatch.shade600,
      fontFamily: 'Nunito',
    ),
    labelSmall: TextStyle(
      color: textSwatch.shade500,
      fontFamily: 'Nunito',
    ),
  ),
);

final ThemeData darkTheme = lightTheme.copyWith(
  colorScheme: darkColorScheme,
  textTheme: TextTheme(
    displayLarge: TextStyle(
      color: textSwatch.shade200,
      fontFamily: 'Nunito',
    ),
    displayMedium: TextStyle(
      color: textSwatch.shade300,
      fontFamily: 'Nunito',
    ),
    displaySmall: TextStyle(
      color: textSwatch.shade400,
      fontFamily: 'Nunito',
    ),
    headlineLarge: TextStyle(
      color: textSwatch.shade200,
      fontFamily: 'Nunito',
    ),
    headlineMedium: TextStyle(
      color: textSwatch.shade300,
      fontFamily: 'Nunito',
    ),
    headlineSmall: TextStyle(
      color: textSwatch.shade400,
      fontFamily: 'Nunito',
    ),
    titleLarge: TextStyle(
      color: textSwatch.shade200,
      fontFamily: 'Nunito',
    ),
    titleMedium: TextStyle(
      color: textSwatch.shade300,
      fontFamily: 'Nunito',
    ),
    titleSmall: TextStyle(
      color: textSwatch.shade400,
      fontFamily: 'Nunito',
    ),
    bodyLarge: TextStyle(
      color: textSwatch.shade200,
      fontFamily: 'Nunito',
    ),
    bodyMedium: TextStyle(
      color: textSwatch.shade300,
      fontFamily: 'Nunito',
    ),
    bodySmall: TextStyle(
      color: textSwatch.shade400,
      fontFamily: 'Nunito',
    ),
    labelLarge: TextStyle(
      color: textSwatch.shade200,
      fontFamily: 'Nunito',
    ),
    labelMedium: TextStyle(
      color: textSwatch.shade300,
      fontFamily: 'Nunito',
    ),
    labelSmall: TextStyle(
      color: textSwatch.shade400,
      fontFamily: 'Nunito',
    ),
  ),
);
+1 −3
Original line number Diff line number Diff line
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/models/game/game.dart';
import 'package:puissance4/models/settings/settings_game.dart';
import 'package:puissance4/models/settings/settings_global.dart';
import 'package:puissance4/robot/robot_player.dart';
import 'package:puissance4/utils/tools.dart';

part 'game_state.dart';

+1 −1
Original line number Diff line number Diff line
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/config/menu.dart';

+1 −2
Original line number Diff line number Diff line
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/config/default_game_settings.dart';
import 'package:puissance4/models/settings/settings_game.dart';
+1 −2
Original line number Diff line number Diff line
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/config/default_global_settings.dart';
import 'package:puissance4/models/settings/settings_global.dart';
+1 −2
Original line number Diff line number Diff line
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

part 'theme_state.dart';

+1 −6
Original line number Diff line number Diff line
import 'dart:io';

import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hive/hive.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/config/theme.dart';
import 'package:puissance4/cubit/game_cubit.dart';
import 'package:puissance4/cubit/nav_cubit.dart';
import 'package:puissance4/cubit/settings_game_cubit.dart';
+1 −1
Original line number Diff line number Diff line
import 'package:puissance4/utils/tools.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

typedef BoardCells = List<List<int>>;

+2 −1
Original line number Diff line number Diff line
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/config/default_game_settings.dart';
import 'package:puissance4/models/game/board.dart';
import 'package:puissance4/models/settings/settings_game.dart';
import 'package:puissance4/models/settings/settings_global.dart';
import 'package:puissance4/utils/tools.dart';

class Game {
  Game({
+2 −1
Original line number Diff line number Diff line
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/config/default_game_settings.dart';
import 'package:puissance4/utils/tools.dart';

class GameSettings {
  final String gameMode;
+2 −1
Original line number Diff line number Diff line
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/config/default_global_settings.dart';
import 'package:puissance4/utils/tools.dart';

class GlobalSettings {
  String skin;

lib/ui/helpers/app_titles.dart

deleted100644 → 0
+0 −32
Original line number Diff line number Diff line
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),
    );
  }
}

lib/ui/helpers/styled_button.dart

deleted100644 → 0
+0 −210
Original line number Diff line number Diff line
import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter/material.dart';

import 'package:puissance4/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;
}
+1 −1
Original line number Diff line number Diff line
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/cubit/game_cubit.dart';
import 'package:puissance4/models/game/game.dart';
+1 −1
Original line number Diff line number Diff line
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/config/default_game_settings.dart';
import 'package:puissance4/config/default_global_settings.dart';
+1 −1
Original line number Diff line number Diff line
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/config/default_game_settings.dart';
import 'package:puissance4/models/settings/settings_game.dart';
import 'package:puissance4/models/settings/settings_global.dart';
import 'package:puissance4/utils/tools.dart';

class ParameterPainter extends CustomPainter {
  const ParameterPainter({
+1 −2
Original line number Diff line number Diff line
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/config/default_game_settings.dart';
import 'package:puissance4/models/settings/settings_game.dart';
import 'package:puissance4/models/settings/settings_global.dart';
import 'package:puissance4/ui/helpers/styled_button.dart';
import 'package:puissance4/ui/parameters/parameter_painter.dart';
import 'package:puissance4/utils/tools.dart';

class ParameterWidget extends StatelessWidget {
  const ParameterWidget({
+1 −4
Original line number Diff line number Diff line
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:package_info_plus/package_info_plus.dart';

import 'package:puissance4/ui/helpers/app_titles.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

class PageAbout extends StatelessWidget {
  const PageAbout({super.key});
+1 −1
Original line number Diff line number Diff line
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/cubit/game_cubit.dart';
import 'package:puissance4/models/game/game.dart';
+1 −1
Original line number Diff line number Diff line
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/ui/helpers/app_titles.dart';
import 'package:puissance4/ui/settings/settings_form.dart';

class PageSettings extends StatelessWidget {
+1 −2
Original line number Diff line number Diff line
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:unicons/unicons.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:puissance4/ui/settings/theme_card.dart';