MVP #141

Merged
flixcoo merged 705 commits from development into main 2026-01-09 12:55:50 +00:00
2 changed files with 76 additions and 47 deletions
Showing only changes of commit d16beed490 - Show all commits

View File

@@ -37,9 +37,23 @@ class _CreateGroupViewState extends State<CreateGroupView> {
void initState() { void initState() {
super.initState(); super.initState();
db = Provider.of<AppDatabase>(context, listen: false); db = Provider.of<AppDatabase>(context, listen: false);
_searchBarController.addListener(() {
setState(() {});
});
_groupNameController.addListener(() {
setState(() {});
});
loadPlayerList(); loadPlayerList();
} }
@override
void dispose() {
_groupNameController.dispose();
_searchBarController
.dispose(); // Listener entfernen und Controller aufräumen
super.dispose();
}
void loadPlayerList() { void loadPlayerList() {
_allPlayersFuture = db.playerDao.getAllPlayers(); _allPlayersFuture = db.playerDao.getAllPlayers();
_allPlayersFuture.then((loadedPlayers) { _allPlayersFuture.then((loadedPlayers) {
@@ -104,40 +118,16 @@ class _CreateGroupViewState extends State<CreateGroupView> {
), ),
hintText: 'Search for players', hintText: 'Search for players',
trailingButtonShown: true, trailingButtonShown: true,
trailingButtonEnabled: trailingButtonEnabled: _searchBarController.text
_searchBarController.text.isNotEmpty, .trim()
.isNotEmpty,
onTrailingButtonPressed: () async { onTrailingButtonPressed: () async {
String playerName = _searchBarController.text.trim(); addNewPlayerFromSearch(
if (playerName.isEmpty) return; context,
bool success = await db.playerDao.addPlayer( _searchBarController,
player: Player(name: playerName), db,
loadPlayerList,
); );
if (!context.mounted) return;
if (success) {
loadPlayerList();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
backgroundColor: CustomTheme.boxColor,
content: Center(
child: Text(
'Successfully added player $playerName.',
style: const TextStyle(color: Colors.white),
),
),
),
);
_searchBarController.clear();
} else {
SnackBar(
backgroundColor: CustomTheme.boxColor,
content: Center(
child: Text(
'Could not add player $playerName.',
style: const TextStyle(color: Colors.white),
),
),
);
}
}, },
onChanged: (value) { onChanged: (value) {
setState(() { setState(() {
@@ -347,3 +337,41 @@ class _CreateGroupViewState extends State<CreateGroupView> {
); );
} }
} }
void addNewPlayerFromSearch(
context,
searchBarController,
db,
loadPlayerList,
) async {
String playerName = searchBarController.text.trim();
bool success = await db.playerDao.addPlayer(player: Player(name: playerName));
if (!context.mounted) return;
if (success) {
loadPlayerList();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
backgroundColor: CustomTheme.boxColor,
content: Center(
child: Text(
'Successfully added player $playerName.',
style: const TextStyle(color: Colors.white),
),
),
),
);
searchBarController.clear();
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
backgroundColor: CustomTheme.boxColor,
content: Center(
child: Text(
'Could not add player $playerName.',
style: const TextStyle(color: Colors.white),
),
),
),
);
}
}

View File

@@ -28,23 +28,24 @@ class CustomSearchBar extends StatelessWidget {
constraints: constraints:
constraints ?? const BoxConstraints(maxHeight: 45, minHeight: 45), constraints ?? const BoxConstraints(maxHeight: 45, minHeight: 45),
hintText: hintText, hintText: hintText,
onChanged: onChanged, onChanged: trailingButtonEnabled ? onChanged : null,
hintStyle: WidgetStateProperty.all(const TextStyle(fontSize: 16)), hintStyle: WidgetStateProperty.all(const TextStyle(fontSize: 16)),
leading: const Icon(Icons.search), leading: const Icon(Icons.search),
trailing: trailingButtonShown trailing: [
? [ Visibility(
GestureDetector( visible: trailingButtonShown,
onTap: onTrailingButtonPressed, child: GestureDetector(
child: Icon( onTap: onTrailingButtonPressed,
Icons.add_circle, child: Icon(
color: trailingButtonEnabled Icons.add_circle,
? null color: trailingButtonEnabled
: Colors.grey.withValues(alpha: 0.2), ? null
), : Colors.grey.withValues(alpha: 0.2),
), ),
const SizedBox(width: 5), ),
] ),
: null, const SizedBox(width: 5),
],
backgroundColor: WidgetStateProperty.all(CustomTheme.boxColor), backgroundColor: WidgetStateProperty.all(CustomTheme.boxColor),
side: WidgetStateProperty.all(BorderSide(color: CustomTheme.boxBorder)), side: WidgetStateProperty.all(BorderSide(color: CustomTheme.boxBorder)),
shape: WidgetStateProperty.all( shape: WidgetStateProperty.all(