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
  • 32-improve-app-metadata
  • Release_0.0.10_10
  • Release_0.0.11_11
  • Release_0.0.12_12
  • Release_0.0.13_13
  • Release_0.0.14_14
  • Release_0.0.15_15
  • Release_0.0.16_16
  • Release_0.0.17_17
  • Release_0.0.18_18
  • Release_0.0.19_19
  • Release_0.0.20_20
  • Release_0.0.21_21
  • Release_0.0.22_22
  • Release_0.0.23_23
  • Release_0.0.24_24
  • Release_0.0.25_25
  • Release_0.0.26_26
  • Release_0.0.2_2
  • Release_0.0.3_3
  • Release_0.0.4_4
  • Release_0.0.5_5
  • Release_0.0.6_6
  • Release_0.0.7_7
  • Release_0.0.8_8
  • Release_0.0.9_9
  • Release_0.1.0_27
  • Release_0.1.1_28
  • Release_0.1.2_29
  • Release_0.2.0_30
  • Release_0.2.1_31
  • Release_0.3.0_32
  • Release_0.3.1_33
  • Release_0.4.0_34
  • Release_0.4.1_35
  • Release_0.4.2_36
  • Release_0.5.0_37
  • Release_0.6.0_38
  • Release_0.7.0_39
  • Release_0.8.0_40
  • Release_0.8.1_41
  • Release_0.8.2_42
  • Release_0.9.0_43
  • Release_0.9.1_44
  • Release_0.9.2_45
46 results

Target

Select target project
  • android / org.benoitharrault.sortgame
1 result
Select Git revision
  • master
  • 32-improve-app-metadata
  • Release_0.0.10_10
  • Release_0.0.11_11
  • Release_0.0.12_12
  • Release_0.0.13_13
  • Release_0.0.14_14
  • Release_0.0.15_15
  • Release_0.0.16_16
  • Release_0.0.17_17
  • Release_0.0.18_18
  • Release_0.0.19_19
  • Release_0.0.20_20
  • Release_0.0.21_21
  • Release_0.0.22_22
  • Release_0.0.23_23
  • Release_0.0.24_24
  • Release_0.0.25_25
  • Release_0.0.26_26
  • Release_0.0.2_2
  • Release_0.0.3_3
  • Release_0.0.4_4
  • Release_0.0.5_5
  • Release_0.0.6_6
  • Release_0.0.7_7
  • Release_0.0.8_8
  • Release_0.0.9_9
  • Release_0.1.0_27
  • Release_0.1.1_28
  • Release_0.1.2_29
  • Release_0.2.0_30
  • Release_0.2.1_31
  • Release_0.3.0_32
  • Release_0.3.1_33
  • Release_0.4.0_34
  • Release_0.4.1_35
  • Release_0.4.2_36
  • Release_0.5.0_37
  • Release_0.6.0_38
  • Release_0.7.0_39
  • Release_0.8.0_40
  • Release_0.8.1_41
  • Release_0.8.2_42
  • Release_0.9.0_43
  • Release_0.9.1_44
  • Release_0.9.2_45
46 results
Show changes

Commits on Source 4

16 files
+ 1226
1037
Compare changes
  • Side-by-side
  • Inline

Files

+2 −2
Original line number Diff line number Diff line
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
app.versionName=0.0.22
app.versionCode=22
app.versionName=0.0.24
app.versionCode=24
+1 −0
Original line number Diff line number Diff line
Add choose categories theme.
+1 −0
Original line number Diff line number Diff line
Lowercase all items.
+1 −0
Original line number Diff line number Diff line
Ajout du choix du thème des catégories.
+1 −0
Original line number Diff line number Diff line
Mise en minuscules de tous les items.
+10 −0
Original line number Diff line number Diff line
import 'package:sortgame/data/fetch_data_helper.dart';
import 'package:sortgame/utils/tools.dart';

class DefaultGameSettings {
  static const List<String> availableParameters = [
    'itemsCount',
    'theme',
  ];

  static const int itemsCountValueLow = 5;
@@ -18,12 +20,20 @@ class DefaultGameSettings {
    itemsCountValueVeryHigh,
  ];

  static const int defaultThemeValue = 0;

  static List<int> getAvailableValues(String parameterCode) {
    switch (parameterCode) {
      case 'itemsCount':
        return DefaultGameSettings.allowedItemsCountValues;
    }

    switch (parameterCode) {
      case 'theme':
        final int count = FetchDataHelper().getThemes().length;
        return List<int>.generate(count, (i) => i);
    }

    printlog('Did not find any available value for game parameter "$parameterCode".');
    return [];
  }
+9 −0
Original line number Diff line number Diff line
@@ -12,11 +12,13 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {

  void setValues({
    int? itemsCount,
    int? theme,
  }) {
    emit(
      GameSettingsState(
        settings: GameSettings(
          itemsCount: itemsCount ?? state.settings.itemsCount,
          theme: theme ?? state.settings.theme,
        ),
      ),
    );
@@ -26,6 +28,8 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
    switch (code) {
      case 'itemsCount':
        return GameSettings.getItemsCountValueFromUnsafe(state.settings.itemsCount);
      case 'theme':
        return GameSettings.getThemeValueFromUnsafe(state.settings.theme);
    }
    return 0;
  }
@@ -35,19 +39,23 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
    printlog('code: $code  / value: $value');

    int itemsCount = code == 'itemsCount' ? value : getParameterValue('itemsCount');
    int theme = code == 'theme' ? value : getParameterValue('theme');

    setValues(
      itemsCount: itemsCount,
      theme: theme,
    );
  }

  @override
  GameSettingsState? fromJson(Map<String, dynamic> json) {
    int itemsCount = json['itemsCount'] as int;
    int theme = json['theme'] as int;

    return GameSettingsState(
      settings: GameSettings(
        itemsCount: itemsCount,
        theme: theme,
      ),
    );
  }
@@ -56,6 +64,7 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
  Map<String, dynamic>? toJson(GameSettingsState state) {
    return <String, dynamic>{
      'itemsCount': state.settings.itemsCount,
      'theme': state.settings.theme,
    };
  }
}
+46 −1
Original line number Diff line number Diff line
import 'package:sortgame/data/game_data.dart';
import 'package:sortgame/models/data/category.dart';
import 'package:sortgame/models/data/game_item.dart';
import 'package:sortgame/models/data/game_theme.dart';
import 'package:sortgame/models/data/item.dart';
import 'package:sortgame/models/settings_game.dart';
import 'package:sortgame/utils/tools.dart';

class FetchDataHelper {
@@ -13,6 +15,9 @@ class FetchDataHelper {
  final List<Item> _items = [];
  List<Item> get items => _items;

  final List<GameTheme> _themes = [];
  List<GameTheme> get themes => _themes;

  final List<GameItem> _mapping = [];

  void init() {
@@ -25,6 +30,16 @@ class FetchDataHelper {
        _categories.add(Category(key: element, text: element));
      }

      final Map<String, dynamic> rawThemes = gameData['themes'] as Map<String, dynamic>;
      rawThemes.forEach((code, rawCategories) {
        final List<Category> categories = [];
        for (var rawElement in rawCategories) {
          final element = rawElement.toString();
          categories.add(Category(key: element, text: element));
        }
        _themes.add(GameTheme(code: code, categories: categories));
      });

      final List<dynamic> rawItems = gameData['items'] as List<dynamic>;
      for (var rawElement in rawItems) {
        final element = rawElement.toString();
@@ -64,13 +79,27 @@ class FetchDataHelper {
    }
  }

  List<GameItem> getItems(int count) {
  List<GameItem> getItems(GameSettings gameSettings) {
    if (_mapping.isEmpty) {
      init();
    }

    final int count = gameSettings.itemsCount;
    final int theme = gameSettings.theme;

    List<GameItem> items = _mapping;

    // Remove unwanted categories if theme is selected
    if (theme != 0) {
      final GameTheme gameTheme = _themes[theme];
      for (GameItem item in items) {
        item.isCategory.removeWhere((Category category) =>
            (!gameTheme.categories.map((c) => c.key).contains(category.key)));
        item.isNotCategory.removeWhere((Category category) =>
            (!gameTheme.categories.map((c) => c.key).contains(category.key)));
      }
    }

    // Remove items without enough data
    items.removeWhere((GameItem gameItem) =>
        (gameItem.isCategory.isEmpty || gameItem.isNotCategory.isEmpty));
@@ -79,4 +108,20 @@ class FetchDataHelper {

    return items.take(count).toList();
  }

  List<GameTheme> getThemes() {
    if (_themes.isEmpty) {
      init();
    }

    return _themes.toList();
  }

  GameTheme getTheme(int themeIndex) {
    if (_themes.isEmpty) {
      init();
    }

    return _themes[themeIndex];
  }
}
+520 −514

File changed.

Preview size limit exceeded, changes collapsed.

+23 −0
Original line number Diff line number Diff line
import 'package:sortgame/models/data/category.dart';

class GameTheme {
  final String code;
  final List<Category> categories;

  GameTheme({
    required this.code,
    required this.categories,
  });

  @override
  String toString() {
    return '$GameTheme(${toJson()})';
  }

  Map<String, dynamic>? toJson() {
    return <String, dynamic>{
      'code': code,
      'categories': categories.toString(),
    };
  }
}
+1 −1
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ class Game {
    GameSettings newGameSettings = gameSettings ?? GameSettings.createDefault();
    GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();

    List<GameItem> items = FetchDataHelper().getItems(newGameSettings.itemsCount);
    List<GameItem> items = FetchDataHelper().getItems(newGameSettings);

    return Game(
      items: items,
+13 −0
Original line number Diff line number Diff line
@@ -3,9 +3,11 @@ import 'package:sortgame/utils/tools.dart';

class GameSettings {
  final int itemsCount;
  final int theme;

  GameSettings({
    required this.itemsCount,
    required this.theme,
  });

  static int getItemsCountValueFromUnsafe(int itemsCount) {
@@ -16,15 +18,25 @@ class GameSettings {
    return DefaultGameSettings.defaultItemsCountValue;
  }

  static int getThemeValueFromUnsafe(int theme) {
    if (DefaultGameSettings.getAvailableValues('theme').contains(theme)) {
      return theme;
    }

    return DefaultGameSettings.defaultThemeValue;
  }

  factory GameSettings.createDefault() {
    return GameSettings(
      itemsCount: DefaultGameSettings.defaultItemsCountValue,
      theme: DefaultGameSettings.defaultThemeValue,
    );
  }

  void dump() {
    printlog('Settings: ');
    printlog('  itemsCount: $itemsCount');
    printlog('  theme: $theme');
  }

  @override
@@ -35,6 +47,7 @@ class GameSettings {
  Map<String, dynamic>? toJson() {
    return <String, dynamic>{
      'itemsCount': itemsCount,
      'theme': theme,
    };
  }
}
+47 −0
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@ import 'dart:math';
import 'package:flutter/material.dart';

import 'package:sortgame/config/default_game_settings.dart';
import 'package:sortgame/data/fetch_data_helper.dart';
import 'package:sortgame/models/data/game_theme.dart';
import 'package:sortgame/models/settings_game.dart';
import 'package:sortgame/models/settings_global.dart';
import 'package:sortgame/utils/tools.dart';
@@ -44,6 +46,9 @@ class ParameterPainter extends CustomPainter {
      case 'itemsCount':
        paintItemsCountParameterItem(value, canvas, canvasSize);
        break;
      case 'theme':
        paintThemeParameterItem(value, canvas, canvasSize);
        break;
      default:
        printlog('Unknown parameter: $code/$value');
        paintUnknownParameterItem(value, canvas, canvasSize);
@@ -146,4 +151,46 @@ class ParameterPainter extends CustomPainter {
      ),
    );
  }

  void paintThemeParameterItem(
    final int value,
    final Canvas canvas,
    final double size,
  ) {
    final GameTheme theme = FetchDataHelper().getTheme(value);

    final Color backgroundColor =
        Color((theme.code.hashCode * 0xFFFFFF).toInt()).withOpacity(1.0);

    final paint = Paint();
    paint.strokeJoin = StrokeJoin.round;
    paint.strokeWidth = 3 / 100 * size;

    // Colored background
    paint.color = backgroundColor;
    paint.style = PaintingStyle.fill;
    canvas.drawRect(Rect.fromPoints(const Offset(0, 0), Offset(size, size)), paint);

    // centered text value
    final textSpan = TextSpan(
      text: theme.code,
      style: TextStyle(
        color: Colors.black,
        fontSize: size / 4,
        fontWeight: FontWeight.bold,
      ),
    );
    final textPainter = TextPainter(
      text: textSpan,
      textDirection: TextDirection.ltr,
    );
    textPainter.layout();
    textPainter.paint(
      canvas,
      Offset(
        (size - textPainter.width) * 0.5,
        (size - textPainter.height) * 0.5,
      ),
    );
  }
}
+1 −1
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@ description: A sorting game application.

publish_to: 'none'

version: 0.0.22+22
version: 0.0.24+24

environment:
  sdk: '^3.0.0'
+528 −511

File changed.

Preview size limit exceeded, changes collapsed.

+22 −7
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ function find_missing_associations(array $mappingItems, array $categories, array
            $mappingItems[$item]['na'],
        );
        foreach ($categories as $category) {
            if ($category === 'inerte' && !\in_array($category, $set)) {
            if (!\in_array($category, $set)) {
                $missing[] = [
                    'item' => $item,
                    'category' => $category,
@@ -106,8 +106,8 @@ if (!is_writable($jsonDataFile)) {
    die;
}

$categories = (\array_key_exists('categories', $data) && \is_array($data['categories'])) ? $data['categories'] : [];;
$items = (\array_key_exists('items', $data) && \is_array($data['items'])) ? $data['items'] : [];;
$categories = (\array_key_exists('categories', $data) && \is_array($data['categories'])) ? $data['categories'] : [];
$items = (\array_key_exists('items', $data) && \is_array($data['items'])) ? $data['items'] : [];

// Manage categories exclusions
$exclusions = (\array_key_exists('exclusions', $data) && \is_array($data['exclusions'])) ? $data['exclusions'] : [];
@@ -121,14 +121,18 @@ foreach ($exclusions as $exclusionSet) {
$categories = array_clean($categories);
$items = array_clean($items);

$themes = (\array_key_exists('themes', $data) && \is_array($data['themes'])) ? $data['themes'] : [];

$data['categories'] = $categories;
$data['items'] = $items;
$data['exclusions'] = $exclusions;
$data['themes'] = $themes;

dump('');
dump('Found ' . \count($categories) . ' unique categories.');
dump('Found ' . \count($items) . ' unique items.');
dump('Found ' . \count($exclusions) . ' exclusions sets.');
dump('Found ' . \count($themes) . ' themes.');

// Get/init mapping data
$mapping = (\array_key_exists('mapping', $data) && \is_array($data['mapping'])) ? $data['mapping'] : [];
@@ -174,6 +178,13 @@ function showExclusions($exclusions)
    }
}

function showThemes($theme)
{
    foreach ($theme as $name => $categories) {
        dump($name . ': ' . \join(', ', $categories));
    }
}

function showMappings($mappingItems)
{
    $columnsWidths = [
@@ -337,14 +348,15 @@ while ($exitMainLoop === false) {
    $missing = find_missing_associations($mappingItems, $categories, $items);

    $menu = [
        '0: exit',
        '0: save and exit',
        '',
        '1: show categories (' . \count($categories) . ' found)',
        '2: show items (' . \count($items) . ' found)',
        '3: show exclusions (' . \count($exclusions) . ' found)',
        '4: show mappings (' . \count($mappingItems) . ' found)',
        '4: show themes (' . \count($themes) . ' found)',
        '5: show mappings (' . \count($mappingItems) . ' found)',
        '',
        '5: complete mappings (' . \count($missing) . ' missing)',
        '6: complete mappings (' . \count($missing) . ' missing)',
    ];
    $answer = ask(\join("\n", $menu));

@@ -362,9 +374,12 @@ while ($exitMainLoop === false) {
            showExclusions($exclusions);
            break;
        case '4':
            showMappings($mappingItems);
            showThemes($themes);
            break;
        case '5':
            showMappings($mappingItems);
            break;
        case '6':
            $data['mapping']['items'] = editMappings($mappingItems, $categories, $items, $exclusions);
            break;
        default: