Skip to content

Commit

Permalink
Add boads, improve decks
Browse files Browse the repository at this point in the history
  • Loading branch information
CodeDoctorDE committed Jan 12, 2025
1 parent dc73b98 commit a757e29
Show file tree
Hide file tree
Showing 11 changed files with 339 additions and 46 deletions.
11 changes: 11 additions & 0 deletions api/lib/src/models/data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,9 @@ class SetonixData extends ArchiveData<SetonixData> {

Iterable<String> getBoards() => getAssets(kPackBoardsPath, true);

Iterable<PackItem<BoardDefinition>> getBoardItems([String namespace = '']) =>
getBoards().map((e) => getBoardItem(e, namespace)).nonNulls;

BoardDefinition? getBoard(String id) {
try {
final data = getAsset('$kPackBoardsPath/$id.json');
Expand All @@ -160,6 +163,14 @@ class SetonixData extends ArchiveData<SetonixData> {
item: getBoard(id),
);

SetonixData removeBoard(String id) =>
removeAsset('$kPackBoardsPath/$id.json');

SetonixData setBoard(String id, BoardDefinition definition) => setAsset(
'$kPackBoardsPath/$id.json',
utf8.encode(definition.toJson()),
);

Iterable<String> getBackgrounds() =>
getAssets('$kPackBackgroundsPath/', true);

Expand Down
4 changes: 0 additions & 4 deletions api/lib/src/models/deck.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,10 @@ part 'deck.mapper.dart';

@MappableClass()
class DeckDefinition with DeckDefinitionMappable {
final String? name;
final String? description;
final List<FigureDeckDefinition> figures;
final List<BoardDeckDefinition> boards;

DeckDefinition({
this.name,
this.description,
this.figures = const [],
this.boards = const [],
});
Expand Down
26 changes: 3 additions & 23 deletions api/lib/src/models/deck.mapper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,6 @@ class DeckDefinitionMapper extends ClassMapperBase<DeckDefinition> {
@override
final String id = 'DeckDefinition';

static String? _$name(DeckDefinition v) => v.name;
static const Field<DeckDefinition, String> _f$name =
Field('name', _$name, opt: true);
static String? _$description(DeckDefinition v) => v.description;
static const Field<DeckDefinition, String> _f$description =
Field('description', _$description, opt: true);
static List<FigureDeckDefinition> _$figures(DeckDefinition v) => v.figures;
static const Field<DeckDefinition, List<FigureDeckDefinition>> _f$figures =
Field('figures', _$figures, opt: true, def: const []);
Expand All @@ -37,18 +31,13 @@ class DeckDefinitionMapper extends ClassMapperBase<DeckDefinition> {

@override
final MappableFields<DeckDefinition> fields = const {
#name: _f$name,
#description: _f$description,
#figures: _f$figures,
#boards: _f$boards,
};

static DeckDefinition _instantiate(DecodingData data) {
return DeckDefinition(
name: data.dec(_f$name),
description: data.dec(_f$description),
figures: data.dec(_f$figures),
boards: data.dec(_f$boards));
figures: data.dec(_f$figures), boards: data.dec(_f$boards));
}

@override
Expand Down Expand Up @@ -115,10 +104,7 @@ abstract class DeckDefinitionCopyWith<$R, $In extends DeckDefinition, $Out>
BoardDeckDefinitionCopyWith<$R, BoardDeckDefinition,
BoardDeckDefinition>> get boards;
$R call(
{String? name,
String? description,
List<FigureDeckDefinition>? figures,
List<BoardDeckDefinition>? boards});
{List<FigureDeckDefinition>? figures, List<BoardDeckDefinition>? boards});
DeckDefinitionCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(
Then<$Out2, $R2> t);
}
Expand Down Expand Up @@ -147,20 +133,14 @@ class _DeckDefinitionCopyWithImpl<$R, $Out>
$value.boards, (v, t) => v.copyWith.$chain(t), (v) => call(boards: v));
@override
$R call(
{Object? name = $none,
Object? description = $none,
List<FigureDeckDefinition>? figures,
{List<FigureDeckDefinition>? figures,
List<BoardDeckDefinition>? boards}) =>
$apply(FieldCopyWithData({
if (name != $none) #name: name,
if (description != $none) #description: description,
if (figures != null) #figures: figures,
if (boards != null) #boards: boards
}));
@override
DeckDefinition $make(CopyWithData data) => DeckDefinition(
name: data.get(#name, or: $value.name),
description: data.get(#description, or: $value.description),
figures: data.get(#figures, or: $value.figures),
boards: data.get(#boards, or: $value.boards));

Expand Down
5 changes: 5 additions & 0 deletions app/lib/bloc/editor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,9 @@ class EditorCubit extends Cubit<SetonixData> {

void setTexture(String name, Uint8List bytes) =>
emit(state.setTexture(name, bytes));

void removeBoard(String id) => emit(state.removeBoard(id));

void setBoard(String id, BoardDefinition definition) =>
emit(state.setBoard(id, definition));
}
3 changes: 2 additions & 1 deletion app/lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -221,5 +221,6 @@
"clear": "Clear",
"textures": "Textures",
"texture": "Texture",
"notSet": "Not set"
"notSet": "Not set",
"category": "Category"
}
163 changes: 163 additions & 0 deletions app/lib/pages/editor/boards.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:material_leap/material_leap.dart';
import 'package:phosphor_flutter/phosphor_flutter.dart';
import 'package:setonix/bloc/editor.dart';
import 'package:setonix/pages/editor/textures.dart';
import 'package:setonix_api/setonix_api.dart';

class BoardsEditorPage extends StatelessWidget {
const BoardsEditorPage({super.key});

@override
Widget build(BuildContext context) {
final cubit = context.read<EditorCubit>();
return Scaffold(
body: SingleChildScrollView(
child: Center(
child: Container(
constraints: BoxConstraints(maxWidth: LeapBreakpoints.expanded),
padding: const EdgeInsets.all(4),
child: BlocBuilder<EditorCubit, SetonixData>(
builder: (context, state) {
final boards = state.getBoardItems();
if (boards.isEmpty) {
return Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(AppLocalizations.of(context).noData),
),
);
}
return Column(
children: boards.map((board) {
final id = board.id;
return Dismissible(
key: ValueKey(id),
onDismissed: (direction) {
cubit.removeBoard(id);
},
child: ListTile(
title: Text(id),
trailing: IconButton(
icon: const Icon(PhosphorIconsLight.trash),
onPressed: () {
cubit.removeBoard(id);
},
),
onTap: () {
showDialog(
context: context,
builder: (context) => BlocProvider.value(
value: cubit,
child: BoardEditorDialog(name: id),
),
);
},
),
);
}).toList(),
);
},
),
),
),
),
floatingActionButton: FloatingActionButton.extended(
onPressed: () async {
final name = await showDialog<String>(
context: context,
builder: (context) => NameDialog(
validator: defaultNameValidator(
context, cubit.state.getBoards().toList()),
));
if (name == null) return;
cubit.setBoard(name, BoardDefinition(texture: ''));
},
label: Text(AppLocalizations.of(context).create),
icon: const Icon(PhosphorIconsLight.plus),
),
);
}
}

class BoardEditorDialog extends StatefulWidget {
final String name;

const BoardEditorDialog({super.key, required this.name});

@override
State<BoardEditorDialog> createState() => _BoardEditorDialogState();
}

class _BoardEditorDialogState extends State<BoardEditorDialog> {
BoardDefinition? _value;
late PackTranslation _translation;

@override
void initState() {
super.initState();
final editorState = context.read<EditorCubit>().state;
_value = editorState.getBoard(widget.name);
_translation = editorState.getTranslationOrDefault();
}

@override
Widget build(BuildContext context) {
final value = _value;
if (value == null) return const SizedBox();
return ResponsiveAlertDialog(
title: Text(widget.name),
constraints: const BoxConstraints(
maxWidth: LeapBreakpoints.compact,
),
content: ListView(
shrinkWrap: true,
children: [
TextFormField(
decoration: InputDecoration(
labelText: AppLocalizations.of(context).name,
filled: true,
icon: const Icon(PhosphorIconsLight.textT),
),
initialValue: _translation.boards[widget.name]?.name,
onChanged: (value) {
final translation = BoardTranslation(name: value);
_translation =
_translation.copyWith.boards.put(widget.name, translation);
},
),
const SizedBox(height: 8),
VisualEditingView(
value: value,
onChanged: (value) {
setState(() {
_value = value;
});
},
),
],
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text(AppLocalizations.of(context).cancel),
),
ElevatedButton(
onPressed: () {
context.read<EditorCubit>().setBoard(widget.name, value);
context.read<EditorCubit>().setTranslation(
_translation,
widget.name,
);
Navigator.of(context).pop();
},
child: Text(AppLocalizations.of(context).save),
),
],
);
}
}
Loading

0 comments on commit a757e29

Please sign in to comment.