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
  • master
  • 27-improve-app-metadata
  • 6-fix-display-grid
  • Release_1.0.10_11
  • Release_1.0.11_12
  • Release_1.0.12_13
  • Release_1.0.13_14
  • Release_1.0.14_15
  • Release_1.0.15_16
  • Release_1.0.16_17
  • Release_1.0.17_18
  • Release_1.0.18_19
  • Release_1.0.19_20
  • Release_1.0.20_21
  • Release_1.0.21_22
  • Release_1.0.5_6
  • Release_1.0.6_7
  • Release_1.0.7_8
  • Release_1.0.8_9
  • Release_1.0.9_10
  • Release_1.1.0_23
  • Release_1.2.0_24
  • Release_1.2.1_25
  • Release_1.3.0_26
  • Release_1.3.1_27
  • Release_1.4.0_28
  • Release_1.4.1_29
  • Release_1.4.2_30
  • Release_1.4.3_31
  • Release_1.5.0_32
  • Release_1.6.0_33
  • Release_1.7.0_34
  • Release_1.8.0_35
  • Release_1.8.1_36
  • Release_1.8.2_37
  • Release_1.9.0_38
  • Release_1.9.1_39
  • Release_1.9.2_40
  • Release_1.9.3_41
39 results

Target

Select target project
  • android / org.benoitharrault.puissance4
1 result
Select Git revision
  • master
  • 27-improve-app-metadata
  • 6-fix-display-grid
  • Release_1.0.10_11
  • Release_1.0.11_12
  • Release_1.0.12_13
  • Release_1.0.13_14
  • Release_1.0.14_15
  • Release_1.0.15_16
  • Release_1.0.16_17
  • Release_1.0.17_18
  • Release_1.0.18_19
  • Release_1.0.19_20
  • Release_1.0.20_21
  • Release_1.0.21_22
  • Release_1.0.5_6
  • Release_1.0.6_7
  • Release_1.0.7_8
  • Release_1.0.8_9
  • Release_1.0.9_10
  • Release_1.1.0_23
  • Release_1.2.0_24
  • Release_1.2.1_25
  • Release_1.3.0_26
  • Release_1.3.1_27
  • Release_1.4.0_28
  • Release_1.4.1_29
  • Release_1.4.2_30
  • Release_1.4.3_31
  • Release_1.5.0_32
  • Release_1.6.0_33
  • Release_1.7.0_34
  • Release_1.8.0_35
  • Release_1.8.1_36
  • Release_1.8.2_37
  • Release_1.9.0_38
  • Release_1.9.1_39
  • Release_1.9.2_40
  • Release_1.9.3_41
39 results
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
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
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
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',
    ),
  ),
);
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';

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';

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';
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';
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';
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>>;

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({
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;
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;
}
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';
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';
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({
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({
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});
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';
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 {
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';

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/theme_cubit.dart';

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/menu.dart';
import 'package:puissance4/cubit/nav_cubit.dart';
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/ui/helpers/styled_button.dart';

class DeleteSavedGameButton extends StatelessWidget {
  const DeleteSavedGameButton({super.key});
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/ui/helpers/styled_button.dart';

class QuitGameButton extends StatelessWidget {
  const QuitGameButton({super.key});
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/cubit/settings_game_cubit.dart';
import 'package:puissance4/cubit/settings_global_cubit.dart';
import 'package:puissance4/ui/helpers/styled_button.dart';

class StartNewGameButton extends StatelessWidget {
  const StartNewGameButton({super.key});
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/ui/helpers/styled_button.dart';

class ResumeSavedGameButton extends StatelessWidget {
  const ResumeSavedGameButton({super.key});
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/ui/helpers/styled_button.dart';

class GameBoardWidget extends StatelessWidget {
  const GameBoardWidget({super.key});
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';
import 'package:puissance4/ui/helpers/styled_button.dart';

class GameBottomWidget extends StatelessWidget {
  const GameBottomWidget({super.key});
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';
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/menu.dart';
import 'package:puissance4/cubit/game_cubit.dart';
import 'package:puissance4/cubit/nav_cubit.dart';
import 'package:puissance4/models/game/game.dart';
import 'package:puissance4/ui/helpers/app_titles.dart';
import 'package:puissance4/ui/helpers/styled_button.dart';

class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget {
  const GlobalAppBar({super.key});
@@ -38,7 +36,7 @@ class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget {
                // go to Settings page
                menuActions.add(ElevatedButton(
                  onPressed: () {
                    context.read<NavCubit>().goToSettingsPage();
                    BlocProvider.of<NavCubit>(context).goToSettingsPage();
                  },
                  style: ElevatedButton.styleFrom(
                    shape: const CircleBorder(),
@@ -49,7 +47,7 @@ class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget {
                // go to About page
                menuActions.add(ElevatedButton(
                  onPressed: () {
                    context.read<NavCubit>().goToAboutPage();
                    BlocProvider.of<NavCubit>(context).goToAboutPage();
                  },
                  style: ElevatedButton.styleFrom(
                    shape: const CircleBorder(),
@@ -60,7 +58,7 @@ class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget {
                // back to Home page
                menuActions.add(ElevatedButton(
                  onPressed: () {
                    context.read<NavCubit>().goToGamePage();
                    BlocProvider.of<NavCubit>(context).goToGamePage();
                  },
                  style: ElevatedButton.styleFrom(
                    shape: const CircleBorder(),

lib/utils/color_extensions.dart

deleted100644 → 0
+0 −33
Original line number Diff line number Diff line
import 'dart:ui';

extension ColorExtension on Color {
  Color darken([int percent = 40]) {
    assert(1 <= percent && percent <= 100);
    final value = 1 - percent / 100;
    return Color.fromARGB(
      alpha,
      (red * value).round(),
      (green * value).round(),
      (blue * value).round(),
    );
  }

  Color lighten([int percent = 40]) {
    assert(1 <= percent && percent <= 100);
    final value = percent / 100;
    return Color.fromARGB(
      alpha,
      (red + ((255 - red) * value)).round(),
      (green + ((255 - green) * value)).round(),
      (blue + ((255 - blue) * value)).round(),
    );
  }

  Color avg(Color other) {
    final red = (this.red + other.red) ~/ 2;
    final green = (this.green + other.green) ~/ 2;
    final blue = (this.blue + other.blue) ~/ 2;
    final alpha = (this.alpha + other.alpha) ~/ 2;
    return Color.fromARGB(alpha, red, green, blue);
  }
}

lib/utils/tools.dart

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

void printlog(String message) {
  if (!kReleaseMode) {
    debugPrint(message);
  }
}
+35 −26
Original line number Diff line number Diff line
@@ -5,20 +5,20 @@ packages:
    dependency: transitive
    description:
      name: args
      sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
      sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6
      url: "https://pub.dev"
    source: hosted
    version: "2.5.0"
    version: "2.6.0"
  async:
    dependency: transitive
    description:
      name: async
      sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
      sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
      url: "https://pub.dev"
    source: hosted
    version: "2.11.0"
    version: "2.12.0"
  auto_size_text:
    dependency: "direct main"
    dependency: transitive
    description:
      name: auto_size_text
      sha256: "3f5261cd3fb5f2a9ab4e2fc3fba84fd9fcaac8821f20a1d4e71f557521b22599"
@@ -61,12 +61,12 @@ packages:
    dependency: transitive
    description:
      name: crypto
      sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27
      sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
      url: "https://pub.dev"
    source: hosted
    version: "3.0.5"
    version: "3.0.6"
  easy_localization:
    dependency: "direct main"
    dependency: transitive
    description:
      name: easy_localization
      sha256: fa59bcdbbb911a764aa6acf96bbb6fa7a5cf8234354fc45ec1a43a0349ef0201
@@ -82,7 +82,7 @@ packages:
    source: hosted
    version: "0.0.2"
  equatable:
    dependency: "direct main"
    dependency: transitive
    description:
      name: equatable
      sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
@@ -111,13 +111,22 @@ packages:
    source: sdk
    version: "0.0.0"
  flutter_bloc:
    dependency: "direct main"
    dependency: transitive
    description:
      name: flutter_bloc
      sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a
      url: "https://pub.dev"
    source: hosted
    version: "8.1.6"
  flutter_custom_toolbox:
    dependency: "direct main"
    description:
      path: "."
      ref: "0.1.1"
      resolved-ref: ba7137ca9edec7e503ed3dbfe7f6ede7e9cfbf4d
      url: "https://git.harrault.fr/android/flutter-toolbox.git"
    source: git
    version: "0.1.1"
  flutter_lints:
    dependency: "direct dev"
    description:
@@ -137,7 +146,7 @@ packages:
    source: sdk
    version: "0.0.0"
  hive:
    dependency: "direct main"
    dependency: transitive
    description:
      name: hive
      sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
@@ -161,7 +170,7 @@ packages:
    source: hosted
    version: "4.0.2"
  hydrated_bloc:
    dependency: "direct main"
    dependency: transitive
    description:
      name: hydrated_bloc
      sha256: af35b357739fe41728df10bec03aad422cdc725a1e702e03af9d2a41ea05160c
@@ -209,13 +218,13 @@ packages:
    source: hosted
    version: "1.0.0"
  package_info_plus:
    dependency: "direct main"
    dependency: transitive
    description:
      name: package_info_plus
      sha256: "894f37107424311bdae3e476552229476777b8752c5a2a2369c0cb9a2d5442ef"
      sha256: df3eb3e0aed5c1107bb0fdb80a8e82e778114958b1c5ac5644fb1ac9cae8a998
      url: "https://pub.dev"
    source: hosted
    version: "8.0.3"
    version: "8.1.0"
  package_info_plus_platform_interface:
    dependency: transitive
    description:
@@ -233,7 +242,7 @@ packages:
    source: hosted
    version: "1.9.0"
  path_provider:
    dependency: "direct main"
    dependency: transitive
    description:
      name: path_provider
      sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
@@ -284,10 +293,10 @@ packages:
    dependency: transitive
    description:
      name: platform
      sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
      sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
      url: "https://pub.dev"
    source: hosted
    version: "3.1.5"
    version: "3.1.6"
  plugin_platform_interface:
    dependency: transitive
    description:
@@ -377,10 +386,10 @@ packages:
    dependency: transitive
    description:
      name: string_scanner
      sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
      sha256: "0bd04f5bb74fcd6ff0606a888a30e917af9bd52820b178eaa464beb11dca84b6"
      url: "https://pub.dev"
    source: hosted
    version: "1.3.0"
    version: "1.4.0"
  synchronized:
    dependency: transitive
    description:
@@ -401,12 +410,12 @@ packages:
    dependency: transitive
    description:
      name: typed_data
      sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
      sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
      url: "https://pub.dev"
    source: hosted
    version: "1.3.2"
    version: "1.4.0"
  unicons:
    dependency: "direct main"
    dependency: transitive
    description:
      name: unicons
      sha256: f3eab9d87c226415ef857cfd2167e1d12ad81ea1f5783b46cf644224fea4eab7
@@ -433,10 +442,10 @@ packages:
    dependency: transitive
    description:
      name: win32
      sha256: "4d45dc9069dba4619dc0ebd93c7cec5e66d8482cb625a370ac806dcc8165f2ec"
      sha256: "2735daae5150e8b1dfeb3eb0544b4d3af0061e9e82cef063adcd583bdae4306a"
      url: "https://pub.dev"
    source: hosted
    version: "5.5.5"
    version: "5.7.0"
  xdg_directories:
    dependency: transitive
    description:
@@ -446,5 +455,5 @@ packages:
    source: hosted
    version: "1.1.0"
sdks:
  dart: ">=3.5.0 <4.0.0"
  dart: ">=3.5.3 <4.0.0"
  flutter: ">=3.24.0"
+5 −22
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@ description: puissance4

publish_to: "none"

version: 1.2.1+25
version: 1.3.0+26

environment:
  sdk: "^3.0.0"
@@ -13,15 +13,10 @@ dependencies:
    sdk: flutter

  # base
  auto_size_text: ^3.0.0
  easy_localization: ^3.0.1
  equatable: ^2.0.5
  flutter_bloc: ^8.1.1
  hive: ^2.2.3
  hydrated_bloc: ^9.0.0
  package_info_plus: ^8.0.0
  path_provider: ^2.0.11
  unicons: ^3.0.0
  flutter_custom_toolbox:
    git:
      url: https://git.harrault.fr/android/flutter-toolbox.git
      ref: 0.1.1

  # specific
  # (none)
@@ -34,15 +29,3 @@ flutter:
  assets:
    - assets/translations/
    - assets/ui/

  fonts:
    - family: Nunito
      fonts:
        - asset: assets/fonts/Nunito-Bold.ttf
          weight: 700
        - asset: assets/fonts/Nunito-Medium.ttf
          weight: 500
        - asset: assets/fonts/Nunito-Regular.ttf
          weight: 400
        - asset: assets/fonts/Nunito-Light.ttf
          weight: 300