Initial commit with gitignore

This commit is contained in:
2026-01-13 14:11:59 +09:00
parent d01c0b781a
commit b302e25132
143 changed files with 7030 additions and 0 deletions

View File

@@ -0,0 +1,133 @@
import 'package:flutter/material.dart';
import '../models/player.dart';
const allRoles = [
'GK',
'CB', 'LSB', 'RSB',
'DMF', 'CMF', 'OMF', 'LMF', 'RMF',
'CF', 'ST', 'LWG', 'RWG',
];
class PoolScreen extends StatefulWidget {
final List<Player> initial;
const PoolScreen({super.key, required this.initial});
@override
State<PoolScreen> createState() => _PoolScreenState();
}
class _PoolScreenState extends State<PoolScreen> {
late List<Player> _players;
final _nameCtrl = TextEditingController();
final Set<String> _selected = {};
@override
void initState() {
super.initState();
_players = [...widget.initial];
}
void _add() {
final name = _nameCtrl.text.trim();
if (name.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('選手名を入力してください')),
);
return;
}
if (_selected.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('適正ポジションを1つ以上選んでください')),
);
return;
}
setState(() {
_players.add(Player(name: name, positions: {..._selected}));
_nameCtrl.clear();
_selected.clear();
});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('追加しました')),
);
}
@override
void dispose() {
_nameCtrl.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('選手プール'),
actions: [
TextButton(
onPressed: () => Navigator.pop(context, _players),
child: const Text('完了', style: TextStyle(color: Colors.white)),
),
],
),
body: Padding(
padding: const EdgeInsets.all(12),
child: Column(
children: [
TextField(
controller: _nameCtrl,
decoration: const InputDecoration(
labelText: '選手名',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 10),
Wrap(
spacing: 8,
runSpacing: 8,
children: allRoles.map((r) {
final on = _selected.contains(r);
return FilterChip(
label: Text(r),
selected: on,
onSelected: (v) {
setState(() {
if (v) _selected.add(r);
else _selected.remove(r);
});
},
);
}).toList(),
),
const SizedBox(height: 10),
ElevatedButton(
onPressed: _add,
child: const Text('追加'),
),
const SizedBox(height: 10),
const Divider(),
Expanded(
child: ListView.builder(
itemCount: _players.length,
itemBuilder: (_, i) {
final p = _players[i];
return ListTile(
title: Text(p.name),
subtitle: Text(p.positions.join(', ')),
trailing: IconButton(
icon: const Icon(Icons.delete),
onPressed: () => setState(() => _players.removeAt(i)),
),
);
},
),
)
],
),
),
);
}
}