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
  • 32-improve-app-metadata
  • master
  • 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
45 results

Target

Select target project
  • android/org.benoitharrault.sortgame
1 result
Select Git revision
  • 32-improve-app-metadata
  • master
  • 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
45 results
Show changes

Commits on Source 4

Showing
with 1226 additions and 1037 deletions
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=0.0.22 app.versionName=0.0.24
app.versionCode=22 app.versionCode=24
Add choose categories theme.
Lowercase all items.
Ajout du choix du thème des catégories.
Mise en minuscules de tous les items.
import 'package:sortgame/data/fetch_data_helper.dart';
import 'package:sortgame/utils/tools.dart'; import 'package:sortgame/utils/tools.dart';
class DefaultGameSettings { class DefaultGameSettings {
static const List<String> availableParameters = [ static const List<String> availableParameters = [
'itemsCount', 'itemsCount',
'theme',
]; ];
static const int itemsCountValueLow = 5; static const int itemsCountValueLow = 5;
...@@ -18,12 +20,20 @@ class DefaultGameSettings { ...@@ -18,12 +20,20 @@ class DefaultGameSettings {
itemsCountValueVeryHigh, itemsCountValueVeryHigh,
]; ];
static const int defaultThemeValue = 0;
static List<int> getAvailableValues(String parameterCode) { static List<int> getAvailableValues(String parameterCode) {
switch (parameterCode) { switch (parameterCode) {
case 'itemsCount': case 'itemsCount':
return DefaultGameSettings.allowedItemsCountValues; 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".'); printlog('Did not find any available value for game parameter "$parameterCode".');
return []; return [];
} }
......
...@@ -12,11 +12,13 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> { ...@@ -12,11 +12,13 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
void setValues({ void setValues({
int? itemsCount, int? itemsCount,
int? theme,
}) { }) {
emit( emit(
GameSettingsState( GameSettingsState(
settings: GameSettings( settings: GameSettings(
itemsCount: itemsCount ?? state.settings.itemsCount, itemsCount: itemsCount ?? state.settings.itemsCount,
theme: theme ?? state.settings.theme,
), ),
), ),
); );
...@@ -26,6 +28,8 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> { ...@@ -26,6 +28,8 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
switch (code) { switch (code) {
case 'itemsCount': case 'itemsCount':
return GameSettings.getItemsCountValueFromUnsafe(state.settings.itemsCount); return GameSettings.getItemsCountValueFromUnsafe(state.settings.itemsCount);
case 'theme':
return GameSettings.getThemeValueFromUnsafe(state.settings.theme);
} }
return 0; return 0;
} }
...@@ -35,19 +39,23 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> { ...@@ -35,19 +39,23 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
printlog('code: $code / value: $value'); printlog('code: $code / value: $value');
int itemsCount = code == 'itemsCount' ? value : getParameterValue('itemsCount'); int itemsCount = code == 'itemsCount' ? value : getParameterValue('itemsCount');
int theme = code == 'theme' ? value : getParameterValue('theme');
setValues( setValues(
itemsCount: itemsCount, itemsCount: itemsCount,
theme: theme,
); );
} }
@override @override
GameSettingsState? fromJson(Map<String, dynamic> json) { GameSettingsState? fromJson(Map<String, dynamic> json) {
int itemsCount = json['itemsCount'] as int; int itemsCount = json['itemsCount'] as int;
int theme = json['theme'] as int;
return GameSettingsState( return GameSettingsState(
settings: GameSettings( settings: GameSettings(
itemsCount: itemsCount, itemsCount: itemsCount,
theme: theme,
), ),
); );
} }
...@@ -56,6 +64,7 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> { ...@@ -56,6 +64,7 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
Map<String, dynamic>? toJson(GameSettingsState state) { Map<String, dynamic>? toJson(GameSettingsState state) {
return <String, dynamic>{ return <String, dynamic>{
'itemsCount': state.settings.itemsCount, 'itemsCount': state.settings.itemsCount,
'theme': state.settings.theme,
}; };
} }
} }
import 'package:sortgame/data/game_data.dart'; import 'package:sortgame/data/game_data.dart';
import 'package:sortgame/models/data/category.dart'; import 'package:sortgame/models/data/category.dart';
import 'package:sortgame/models/data/game_item.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/data/item.dart';
import 'package:sortgame/models/settings_game.dart';
import 'package:sortgame/utils/tools.dart'; import 'package:sortgame/utils/tools.dart';
class FetchDataHelper { class FetchDataHelper {
...@@ -13,6 +15,9 @@ class FetchDataHelper { ...@@ -13,6 +15,9 @@ class FetchDataHelper {
final List<Item> _items = []; final List<Item> _items = [];
List<Item> get items => _items; List<Item> get items => _items;
final List<GameTheme> _themes = [];
List<GameTheme> get themes => _themes;
final List<GameItem> _mapping = []; final List<GameItem> _mapping = [];
void init() { void init() {
...@@ -25,6 +30,16 @@ class FetchDataHelper { ...@@ -25,6 +30,16 @@ class FetchDataHelper {
_categories.add(Category(key: element, text: element)); _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>; final List<dynamic> rawItems = gameData['items'] as List<dynamic>;
for (var rawElement in rawItems) { for (var rawElement in rawItems) {
final element = rawElement.toString(); final element = rawElement.toString();
...@@ -64,13 +79,27 @@ class FetchDataHelper { ...@@ -64,13 +79,27 @@ class FetchDataHelper {
} }
} }
List<GameItem> getItems(int count) { List<GameItem> getItems(GameSettings gameSettings) {
if (_mapping.isEmpty) { if (_mapping.isEmpty) {
init(); init();
} }
final int count = gameSettings.itemsCount;
final int theme = gameSettings.theme;
List<GameItem> items = _mapping; 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 // Remove items without enough data
items.removeWhere((GameItem gameItem) => items.removeWhere((GameItem gameItem) =>
(gameItem.isCategory.isEmpty || gameItem.isNotCategory.isEmpty)); (gameItem.isCategory.isEmpty || gameItem.isNotCategory.isEmpty));
...@@ -79,4 +108,20 @@ class FetchDataHelper { ...@@ -79,4 +108,20 @@ class FetchDataHelper {
return items.take(count).toList(); 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];
}
} }
This diff is collapsed.
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(),
};
}
}
...@@ -38,7 +38,7 @@ class Game { ...@@ -38,7 +38,7 @@ class Game {
GameSettings newGameSettings = gameSettings ?? GameSettings.createDefault(); GameSettings newGameSettings = gameSettings ?? GameSettings.createDefault();
GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault(); GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();
List<GameItem> items = FetchDataHelper().getItems(newGameSettings.itemsCount); List<GameItem> items = FetchDataHelper().getItems(newGameSettings);
return Game( return Game(
items: items, items: items,
......
...@@ -3,9 +3,11 @@ import 'package:sortgame/utils/tools.dart'; ...@@ -3,9 +3,11 @@ import 'package:sortgame/utils/tools.dart';
class GameSettings { class GameSettings {
final int itemsCount; final int itemsCount;
final int theme;
GameSettings({ GameSettings({
required this.itemsCount, required this.itemsCount,
required this.theme,
}); });
static int getItemsCountValueFromUnsafe(int itemsCount) { static int getItemsCountValueFromUnsafe(int itemsCount) {
...@@ -16,15 +18,25 @@ class GameSettings { ...@@ -16,15 +18,25 @@ class GameSettings {
return DefaultGameSettings.defaultItemsCountValue; return DefaultGameSettings.defaultItemsCountValue;
} }
static int getThemeValueFromUnsafe(int theme) {
if (DefaultGameSettings.getAvailableValues('theme').contains(theme)) {
return theme;
}
return DefaultGameSettings.defaultThemeValue;
}
factory GameSettings.createDefault() { factory GameSettings.createDefault() {
return GameSettings( return GameSettings(
itemsCount: DefaultGameSettings.defaultItemsCountValue, itemsCount: DefaultGameSettings.defaultItemsCountValue,
theme: DefaultGameSettings.defaultThemeValue,
); );
} }
void dump() { void dump() {
printlog('Settings: '); printlog('Settings: ');
printlog(' itemsCount: $itemsCount'); printlog(' itemsCount: $itemsCount');
printlog(' theme: $theme');
} }
@override @override
...@@ -35,6 +47,7 @@ class GameSettings { ...@@ -35,6 +47,7 @@ class GameSettings {
Map<String, dynamic>? toJson() { Map<String, dynamic>? toJson() {
return <String, dynamic>{ return <String, dynamic>{
'itemsCount': itemsCount, 'itemsCount': itemsCount,
'theme': theme,
}; };
} }
} }
...@@ -3,6 +3,8 @@ import 'dart:math'; ...@@ -3,6 +3,8 @@ import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:sortgame/config/default_game_settings.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_game.dart';
import 'package:sortgame/models/settings_global.dart'; import 'package:sortgame/models/settings_global.dart';
import 'package:sortgame/utils/tools.dart'; import 'package:sortgame/utils/tools.dart';
...@@ -44,6 +46,9 @@ class ParameterPainter extends CustomPainter { ...@@ -44,6 +46,9 @@ class ParameterPainter extends CustomPainter {
case 'itemsCount': case 'itemsCount':
paintItemsCountParameterItem(value, canvas, canvasSize); paintItemsCountParameterItem(value, canvas, canvasSize);
break; break;
case 'theme':
paintThemeParameterItem(value, canvas, canvasSize);
break;
default: default:
printlog('Unknown parameter: $code/$value'); printlog('Unknown parameter: $code/$value');
paintUnknownParameterItem(value, canvas, canvasSize); paintUnknownParameterItem(value, canvas, canvasSize);
...@@ -146,4 +151,46 @@ class ParameterPainter extends CustomPainter { ...@@ -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,
),
);
}
} }
...@@ -3,7 +3,7 @@ description: A sorting game application. ...@@ -3,7 +3,7 @@ description: A sorting game application.
publish_to: 'none' publish_to: 'none'
version: 0.0.22+22 version: 0.0.24+24
environment: environment:
sdk: '^3.0.0' sdk: '^3.0.0'
......
This diff is collapsed.
...@@ -34,7 +34,7 @@ function find_missing_associations(array $mappingItems, array $categories, array ...@@ -34,7 +34,7 @@ function find_missing_associations(array $mappingItems, array $categories, array
$mappingItems[$item]['na'], $mappingItems[$item]['na'],
); );
foreach ($categories as $category) { foreach ($categories as $category) {
if ($category === 'inerte' && !\in_array($category, $set)) { if (!\in_array($category, $set)) {
$missing[] = [ $missing[] = [
'item' => $item, 'item' => $item,
'category' => $category, 'category' => $category,
...@@ -106,8 +106,8 @@ if (!is_writable($jsonDataFile)) { ...@@ -106,8 +106,8 @@ if (!is_writable($jsonDataFile)) {
die; die;
} }
$categories = (\array_key_exists('categories', $data) && \is_array($data['categories'])) ? $data['categories'] : [];; $categories = (\array_key_exists('categories', $data) && \is_array($data['categories'])) ? $data['categories'] : [];
$items = (\array_key_exists('items', $data) && \is_array($data['items'])) ? $data['items'] : [];; $items = (\array_key_exists('items', $data) && \is_array($data['items'])) ? $data['items'] : [];
// Manage categories exclusions // Manage categories exclusions
$exclusions = (\array_key_exists('exclusions', $data) && \is_array($data['exclusions'])) ? $data['exclusions'] : []; $exclusions = (\array_key_exists('exclusions', $data) && \is_array($data['exclusions'])) ? $data['exclusions'] : [];
...@@ -121,14 +121,18 @@ foreach ($exclusions as $exclusionSet) { ...@@ -121,14 +121,18 @@ foreach ($exclusions as $exclusionSet) {
$categories = array_clean($categories); $categories = array_clean($categories);
$items = array_clean($items); $items = array_clean($items);
$themes = (\array_key_exists('themes', $data) && \is_array($data['themes'])) ? $data['themes'] : [];
$data['categories'] = $categories; $data['categories'] = $categories;
$data['items'] = $items; $data['items'] = $items;
$data['exclusions'] = $exclusions; $data['exclusions'] = $exclusions;
$data['themes'] = $themes;
dump(''); dump('');
dump('Found ' . \count($categories) . ' unique categories.'); dump('Found ' . \count($categories) . ' unique categories.');
dump('Found ' . \count($items) . ' unique items.'); dump('Found ' . \count($items) . ' unique items.');
dump('Found ' . \count($exclusions) . ' exclusions sets.'); dump('Found ' . \count($exclusions) . ' exclusions sets.');
dump('Found ' . \count($themes) . ' themes.');
// Get/init mapping data // Get/init mapping data
$mapping = (\array_key_exists('mapping', $data) && \is_array($data['mapping'])) ? $data['mapping'] : []; $mapping = (\array_key_exists('mapping', $data) && \is_array($data['mapping'])) ? $data['mapping'] : [];
...@@ -174,6 +178,13 @@ function showExclusions($exclusions) ...@@ -174,6 +178,13 @@ function showExclusions($exclusions)
} }
} }
function showThemes($theme)
{
foreach ($theme as $name => $categories) {
dump($name . ': ' . \join(', ', $categories));
}
}
function showMappings($mappingItems) function showMappings($mappingItems)
{ {
$columnsWidths = [ $columnsWidths = [
...@@ -337,14 +348,15 @@ while ($exitMainLoop === false) { ...@@ -337,14 +348,15 @@ while ($exitMainLoop === false) {
$missing = find_missing_associations($mappingItems, $categories, $items); $missing = find_missing_associations($mappingItems, $categories, $items);
$menu = [ $menu = [
'0: exit', '0: save and exit',
'', '',
'1: show categories (' . \count($categories) . ' found)', '1: show categories (' . \count($categories) . ' found)',
'2: show items (' . \count($items) . ' found)', '2: show items (' . \count($items) . ' found)',
'3: show exclusions (' . \count($exclusions) . ' 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)); $answer = ask(\join("\n", $menu));
...@@ -362,9 +374,12 @@ while ($exitMainLoop === false) { ...@@ -362,9 +374,12 @@ while ($exitMainLoop === false) {
showExclusions($exclusions); showExclusions($exclusions);
break; break;
case '4': case '4':
showMappings($mappingItems); showThemes($themes);
break; break;
case '5': case '5':
showMappings($mappingItems);
break;
case '6':
$data['mapping']['items'] = editMappings($mappingItems, $categories, $items, $exclusions); $data['mapping']['items'] = editMappings($mappingItems, $categories, $items, $exclusions);
break; break;
default: default:
......