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

Target

Select target project
  • android/org.benoitharrault.sortgame
1 result
Select Git revision
Show changes
Commits on Source (4)
Showing
with 1226 additions and 1037 deletions
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
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';
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 [];
}
......
......@@ -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,
};
}
}
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];
}
}
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 {
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,
......
......@@ -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,
};
}
}
......@@ -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,
),
);
}
}
......@@ -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'
......
This diff is collapsed.
......@@ -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:
......