Merge branch 'development' into feature/206-Neuer-Regelsatz-Platzierung
# Conflicts: # lib/l10n/generated/app_localizations.dart # lib/presentation/views/main_menu/match_view/match_detail_view.dart # lib/presentation/views/main_menu/match_view/match_result_view.dart
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_numeric_text/flutter_numeric_text.dart';
|
||||
import 'package:tallee/core/custom_theme.dart';
|
||||
import 'package:tallee/presentation/widgets/buttons/main_menu_button.dart';
|
||||
|
||||
class LiveEditListTile extends StatefulWidget {
|
||||
const LiveEditListTile({
|
||||
super.key,
|
||||
required this.title,
|
||||
required this.value,
|
||||
this.onChanged,
|
||||
});
|
||||
|
||||
final String title;
|
||||
|
||||
final int value;
|
||||
|
||||
final void Function(int newValue)? onChanged;
|
||||
|
||||
@override
|
||||
State<LiveEditListTile> createState() => _LiveEditListTileState();
|
||||
}
|
||||
|
||||
class _LiveEditListTileState extends State<LiveEditListTile> {
|
||||
int _score = 0;
|
||||
final int maxScore = 9999;
|
||||
final int minScore = -9999;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_score = widget.value;
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 20),
|
||||
margin: const EdgeInsets.symmetric(vertical: 12, horizontal: 8),
|
||||
decoration: CustomTheme.standardBoxDecoration,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
MainMenuButton(
|
||||
onPressed: () => _score > minScore
|
||||
? {
|
||||
setState(() {
|
||||
_score--;
|
||||
if (widget.onChanged != null) {
|
||||
widget.onChanged!(_score);
|
||||
}
|
||||
}),
|
||||
}
|
||||
: null,
|
||||
onLongPressed: () => _score > minScore
|
||||
? {
|
||||
setState(() {
|
||||
_score -= 10;
|
||||
if (widget.onChanged != null) {
|
||||
widget.onChanged!(_score);
|
||||
}
|
||||
}),
|
||||
}
|
||||
: null,
|
||||
icon: Icons.remove_rounded,
|
||||
),
|
||||
Expanded(
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
widget.title,
|
||||
style: const TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 150,
|
||||
child: NumericText(
|
||||
_score.toString(),
|
||||
maxLines: 1,
|
||||
textAlign: TextAlign.center,
|
||||
textWidthBasis: TextWidthBasis.longestLine,
|
||||
textHeightBehavior: const TextHeightBehavior(
|
||||
applyHeightToFirstAscent: false,
|
||||
applyHeightToLastDescent: false,
|
||||
),
|
||||
style: const TextStyle(
|
||||
fontSize: 48,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
MainMenuButton(
|
||||
onPressed: () => _score < maxScore
|
||||
? {
|
||||
setState(() {
|
||||
_score++;
|
||||
if (widget.onChanged != null) {
|
||||
widget.onChanged!(_score);
|
||||
}
|
||||
}),
|
||||
}
|
||||
: null,
|
||||
onLongPressed: () => _score > minScore
|
||||
? {
|
||||
setState(() {
|
||||
_score += 10;
|
||||
if (widget.onChanged != null) {
|
||||
widget.onChanged!(_score);
|
||||
}
|
||||
}),
|
||||
}
|
||||
: null,
|
||||
icon: Icons.add_rounded,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -40,9 +40,13 @@ class ScoreListTile extends StatelessWidget {
|
||||
height: 40,
|
||||
child: TextField(
|
||||
controller: controller,
|
||||
keyboardType: TextInputType.number,
|
||||
maxLength: 4,
|
||||
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
|
||||
keyboardType: const TextInputType.numberWithOptions(signed: true),
|
||||
maxLength: 5,
|
||||
inputFormatters: [
|
||||
TextInputFormatter.withFunction((oldValue, newValue) {
|
||||
return isValidScoreInput(newValue.text) ? newValue : oldValue;
|
||||
}),
|
||||
],
|
||||
textAlign: TextAlign.center,
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
@@ -62,7 +66,7 @@ class ScoreListTile extends StatelessWidget {
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
borderSide: BorderSide(
|
||||
color: CustomTheme.textColor.withAlpha(100),
|
||||
color: CustomTheme.textColor.withAlpha(250),
|
||||
width: 2,
|
||||
),
|
||||
),
|
||||
@@ -80,4 +84,21 @@ class ScoreListTile extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// Validates the input for the score text field.
|
||||
bool isValidScoreInput(String text) {
|
||||
if (text.isEmpty || text == '-') {
|
||||
return true;
|
||||
}
|
||||
|
||||
final isNegative = text.startsWith('-');
|
||||
final digits = isNegative ? text.substring(1) : text;
|
||||
|
||||
if (digits.isEmpty || digits.length > 4) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// CHeck if all characters are digits 0 <= x <= 9
|
||||
return digits.codeUnits.every((unit) => unit >= 48 && unit <= 57);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user