232 lines
7.5 KiB
Dart
232 lines
7.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:manager_app/Components/multi_string_input_and_resource_container.dart';
|
|
import 'package:manager_app/Components/number_input_container.dart';
|
|
import 'package:manager_app/Components/resource_input_container.dart';
|
|
import 'package:manager_api_new/api.dart';
|
|
import 'package:manager_app/Screens/Configurations/Section/SubSection/Parcours/parcours_config.dart';
|
|
import 'package:manager_app/constants.dart';
|
|
|
|
class GameConfig extends StatefulWidget {
|
|
final String? color;
|
|
final String? label;
|
|
final GameDTO initialValue;
|
|
final ValueChanged<GameDTO> onChanged;
|
|
const GameConfig({
|
|
Key? key,
|
|
this.color,
|
|
this.label,
|
|
required this.initialValue,
|
|
required this.onChanged,
|
|
}) : super(key: key);
|
|
|
|
@override
|
|
_GameConfigState createState() => _GameConfigState();
|
|
}
|
|
|
|
class _GameConfigState extends State<GameConfig> {
|
|
late GameDTO gameDTO;
|
|
|
|
@override
|
|
void initState() {
|
|
gameDTO = widget.initialValue;
|
|
gameDTO.rows = gameDTO.rows ?? 3;
|
|
gameDTO.cols = gameDTO.cols ?? 3;
|
|
gameDTO.gameType = gameDTO.gameType ?? GameTypes.Puzzle;
|
|
gameDTO.messageDebut = gameDTO.messageDebut ?? [];
|
|
gameDTO.messageFin = gameDTO.messageFin ?? [];
|
|
gameDTO.guidedPaths = gameDTO.guidedPaths ?? [];
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
void didUpdateWidget(GameConfig oldWidget) {
|
|
super.didUpdateWidget(oldWidget);
|
|
if (widget.initialValue.id != oldWidget.initialValue.id) {
|
|
setState(() {
|
|
gameDTO = widget.initialValue;
|
|
gameDTO.rows = gameDTO.rows ?? 3;
|
|
gameDTO.cols = gameDTO.cols ?? 3;
|
|
gameDTO.gameType = gameDTO.gameType ?? GameTypes.Puzzle;
|
|
});
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
int initialIndex = gameDTO.gameType?.value ?? 0;
|
|
|
|
return DefaultTabController(
|
|
key: ValueKey("${gameDTO.id}_$initialIndex"),
|
|
length: 3,
|
|
initialIndex: initialIndex,
|
|
child: Builder(builder: (context) {
|
|
final TabController controller = DefaultTabController.of(context);
|
|
|
|
// Attach listener to sync gameType when tab changes
|
|
controller.addListener(() {
|
|
if (!controller.indexIsChanging) {
|
|
GameTypes newType = GameTypes.values[controller.index];
|
|
if (gameDTO.gameType != newType) {
|
|
setState(() {
|
|
gameDTO.gameType = newType;
|
|
});
|
|
widget.onChanged(gameDTO);
|
|
}
|
|
}
|
|
});
|
|
|
|
return Column(
|
|
children: [
|
|
TabBar(
|
|
labelColor: kPrimaryColor,
|
|
unselectedLabelColor: Colors.grey,
|
|
indicatorColor: kPrimaryColor,
|
|
tabs: [
|
|
Tab(icon: Icon(Icons.extension), text: "Puzzle"),
|
|
Tab(icon: Icon(Icons.grid_on), text: "Puzzle Glissant"),
|
|
Tab(icon: Icon(Icons.door_front_door), text: "Escape Game"),
|
|
],
|
|
),
|
|
Container(
|
|
height: 650,
|
|
child: TabBarView(
|
|
children: [
|
|
_buildPuzzleConfig(),
|
|
_buildPuzzleConfig(),
|
|
ParcoursConfig(
|
|
initialValue: gameDTO.guidedPaths ?? [],
|
|
parentId: gameDTO.id!,
|
|
isEvent: false,
|
|
isEscapeMode: true,
|
|
onChanged: (paths) {
|
|
setState(() {
|
|
gameDTO.guidedPaths = paths;
|
|
widget.onChanged(gameDTO);
|
|
});
|
|
},
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}),
|
|
);
|
|
}
|
|
|
|
Widget _buildPuzzleConfig() {
|
|
return SingleChildScrollView(
|
|
child: Column(
|
|
children: [
|
|
Padding(
|
|
padding: const EdgeInsets.only(top: 16.0),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
children: [
|
|
ResourceInputContainer(
|
|
label: "Image du puzzle :",
|
|
initialValue: gameDTO.puzzleImageId ?? '',
|
|
color: kPrimaryColor,
|
|
onChanged: (ResourceDTO resourceDTO) {
|
|
setState(() {
|
|
if (resourceDTO.id == null) {
|
|
gameDTO.puzzleImageId = null;
|
|
gameDTO.puzzleImage = null;
|
|
} else {
|
|
gameDTO.puzzleImageId = resourceDTO.id;
|
|
gameDTO.puzzleImage = resourceDTO;
|
|
}
|
|
widget.onChanged(gameDTO);
|
|
});
|
|
},
|
|
),
|
|
Flexible(
|
|
child: MultiStringInputAndResourceContainer(
|
|
label: "Message départ :",
|
|
modalLabel: "Message départ",
|
|
fontSize: 20,
|
|
color: kPrimaryColor,
|
|
initialValue: gameDTO.messageDebut ?? [],
|
|
resourceTypes: [
|
|
ResourceType.Image,
|
|
ResourceType.ImageUrl,
|
|
ResourceType.VideoUrl,
|
|
ResourceType.Video,
|
|
ResourceType.Audio
|
|
],
|
|
onGetResult: (value) {
|
|
setState(() {
|
|
gameDTO.messageDebut = value;
|
|
widget.onChanged(gameDTO);
|
|
});
|
|
},
|
|
maxLines: 1,
|
|
isTitle: false,
|
|
),
|
|
),
|
|
Flexible(
|
|
child: MultiStringInputAndResourceContainer(
|
|
label: "Message fin :",
|
|
modalLabel: "Message fin",
|
|
fontSize: 20,
|
|
color: kPrimaryColor,
|
|
initialValue: gameDTO.messageFin ?? [],
|
|
resourceTypes: [
|
|
ResourceType.Image,
|
|
ResourceType.ImageUrl,
|
|
ResourceType.VideoUrl,
|
|
ResourceType.Video,
|
|
ResourceType.Audio
|
|
],
|
|
onGetResult: (value) {
|
|
setState(() {
|
|
gameDTO.messageFin = value;
|
|
widget.onChanged(gameDTO);
|
|
});
|
|
},
|
|
maxLines: 1,
|
|
isTitle: false,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
children: [
|
|
NumberInputContainer(
|
|
label: "Lignes :",
|
|
initialValue: gameDTO.rows ?? 3,
|
|
isSmall: true,
|
|
onChanged: (String value) {
|
|
setState(() {
|
|
gameDTO.rows = int.tryParse(value) ?? 3;
|
|
widget.onChanged(gameDTO);
|
|
});
|
|
},
|
|
),
|
|
NumberInputContainer(
|
|
label: "Colonnes :",
|
|
initialValue: gameDTO.cols ?? 3,
|
|
isSmall: true,
|
|
onChanged: (String value) {
|
|
setState(() {
|
|
gameDTO.cols = int.tryParse(value) ?? 3;
|
|
widget.onChanged(gameDTO);
|
|
});
|
|
},
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|