diff --git a/lib/widgets/game_card.dart b/lib/widgets/game_card.dart index ecec4bb..0e9cb7b 100644 --- a/lib/widgets/game_card.dart +++ b/lib/widgets/game_card.dart @@ -25,6 +25,13 @@ class _GameCardState extends State bool _isLoading = false; int _deleteClickCount = 0; late TextEditingController _nameController; + late TextEditingController _versionRegexController; + late TextEditingController _rssFeedUrlController; + late TextEditingController _lastPlayedController; + late FocusNode _nameFocus; + late FocusNode _versionRegexFocus; + late FocusNode _rssFeedUrlFocus; + late FocusNode _lastPlayedFocus; @override void initState() { @@ -34,12 +41,55 @@ class _GameCardState extends State vsync: this, ); _nameController = TextEditingController(text: widget.game.name); + _versionRegexController = TextEditingController(text: widget.game.versionRegex); + _rssFeedUrlController = TextEditingController(text: widget.game.rssFeedUrl); + _lastPlayedController = TextEditingController(text: widget.game.lastPlayed); + + _nameFocus = FocusNode(); + _versionRegexFocus = FocusNode(); + _rssFeedUrlFocus = FocusNode(); + _lastPlayedFocus = FocusNode(); + + _setupFocusListeners(); + } + + void _setupFocusListeners() { + void updateGame() { + widget.onGameUpdated(Game( + name: widget.isNameEditable ? _nameController.text : widget.game.name, + versionRegex: _versionRegexController.text, + lastPlayed: _lastPlayedController.text, + rssFeedUrl: _rssFeedUrlController.text, + actualVersion: widget.game.actualVersion, + lastUpdated: widget.game.lastUpdated, + )); + } + + _nameFocus.addListener(() { + if (!_nameFocus.hasFocus) updateGame(); + }); + _versionRegexFocus.addListener(() { + if (!_versionRegexFocus.hasFocus) updateGame(); + }); + _rssFeedUrlFocus.addListener(() { + if (!_rssFeedUrlFocus.hasFocus) updateGame(); + }); + _lastPlayedFocus.addListener(() { + if (!_lastPlayedFocus.hasFocus) updateGame(); + }); } @override void dispose() { _controller.dispose(); _nameController.dispose(); + _versionRegexController.dispose(); + _rssFeedUrlController.dispose(); + _lastPlayedController.dispose(); + _nameFocus.dispose(); + _versionRegexFocus.dispose(); + _rssFeedUrlFocus.dispose(); + _lastPlayedFocus.dispose(); super.dispose(); } @@ -89,22 +139,13 @@ class _GameCardState extends State Expanded( child: TextField( controller: _nameController, + focusNode: _nameFocus, style: Theme.of(context).textTheme.titleLarge, enabled: widget.isNameEditable, decoration: const InputDecoration.collapsed( hintText: 'New Game', ), - onChanged: - (value) => widget.onGameUpdated( - Game( - name: value, - versionRegex: widget.game.versionRegex, - lastPlayed: widget.game.lastPlayed, - rssFeedUrl: widget.game.rssFeedUrl, - actualVersion: widget.game.actualVersion, - lastUpdated: widget.game.lastUpdated, - ), - ), + onSubmitted: (_) => _nameFocus.unfocus(), ), ), Row( @@ -188,58 +229,22 @@ class _GameCardState extends State ), const Divider(), TextField( - controller: TextEditingController(text: widget.game.versionRegex), + controller: _versionRegexController, + focusNode: _versionRegexFocus, decoration: const InputDecoration(labelText: 'Version Regex'), - onChanged: - (value) => widget.onGameUpdated( - Game( - name: - widget.isNameEditable - ? _nameController.text - : widget.game.name, - versionRegex: value, - lastPlayed: widget.game.lastPlayed, - rssFeedUrl: widget.game.rssFeedUrl, - actualVersion: widget.game.actualVersion, - lastUpdated: widget.game.lastUpdated, - ), - ), + onSubmitted: (_) => _versionRegexFocus.unfocus(), ), TextField( - controller: TextEditingController(text: widget.game.rssFeedUrl), + controller: _rssFeedUrlController, + focusNode: _rssFeedUrlFocus, decoration: const InputDecoration(labelText: 'RSS Feed URL'), - onChanged: - (value) => widget.onGameUpdated( - Game( - name: - widget.isNameEditable - ? _nameController.text - : widget.game.name, - versionRegex: widget.game.versionRegex, - lastPlayed: widget.game.lastPlayed, - rssFeedUrl: value, - actualVersion: widget.game.actualVersion, - lastUpdated: widget.game.lastUpdated, - ), - ), + onSubmitted: (_) => _rssFeedUrlFocus.unfocus(), ), TextField( - controller: TextEditingController(text: widget.game.lastPlayed), + controller: _lastPlayedController, + focusNode: _lastPlayedFocus, decoration: const InputDecoration(labelText: 'Last Played'), - onChanged: - (value) => widget.onGameUpdated( - Game( - name: - widget.isNameEditable - ? _nameController.text - : widget.game.name, - versionRegex: widget.game.versionRegex, - lastPlayed: value, - rssFeedUrl: widget.game.rssFeedUrl, - actualVersion: widget.game.actualVersion, - lastUpdated: widget.game.lastUpdated, - ), - ), + onSubmitted: (_) => _lastPlayedFocus.unfocus(), ), ], ),