Skip to content

Commit

Permalink
Fix duration input bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
Robbendebiene committed Nov 20, 2023
1 parent c6c29de commit 9b58268
Showing 1 changed file with 35 additions and 36 deletions.
71 changes: 35 additions & 36 deletions lib/widgets/question_inputs/duration_input.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ class DurationInput extends QuestionInputWidget<DurationAnswerDefinition, Durati
height: 150,
child: Row(
children: _intersperse(
_children(context),
_children(context).map(
(child) => Flexible(child: child),
),
const VerticalDivider(color: Colors.transparent),
).toList(),
),
Expand All @@ -68,47 +70,39 @@ class DurationInput extends QuestionInputWidget<DurationAnswerDefinition, Durati
Iterable<Widget> _children(BuildContext context) sync* {
final appLocale = AppLocalizations.of(context)!;
if (definition.input.days.display) {
yield Flexible(
child: TimeScroller(
name: appLocale.durationInputDaysLabel,
step: definition.input.days.step,
limit: _maxDays,
value: _remainingDays,
onChange: (value) => _handleChange(days: value),
),
yield TimeScroller(
name: appLocale.durationInputDaysLabel,
step: definition.input.days.step,
limit: _maxDays,
value: _remainingDays,
onChange: (value) => _handleChange(days: value),
);
}
if (definition.input.hours.display) {
yield Flexible(
child: TimeScroller(
name: appLocale.durationInputHoursLabel,
step: definition.input.hours.step,
limit: _maxHours,
value: _remainingHours,
onChange: (value) => _handleChange(hours: value),
),
yield TimeScroller(
name: appLocale.durationInputHoursLabel,
step: definition.input.hours.step,
limit: _maxHours,
value: _remainingHours,
onChange: (value) => _handleChange(hours: value),
);
}
if (definition.input.minutes.display) {
yield Flexible(
child: TimeScroller(
name: appLocale.durationInputMinutesLabel,
step: definition.input.minutes.step,
limit: _maxMinutes,
value: _remainingMinutes,
onChange: (value) => _handleChange(minutes: value),
),
yield TimeScroller(
name: appLocale.durationInputMinutesLabel,
step: definition.input.minutes.step,
limit: _maxMinutes,
value: _remainingMinutes,
onChange: (value) => _handleChange(minutes: value),
);
}
if (definition.input.seconds.display) {
yield Flexible(
child: TimeScroller(
name: appLocale.durationInputSecondsLabel,
step: definition.input.seconds.step,
limit: _maxSeconds,
value: _remainingSeconds,
onChange: (value) => _handleChange(seconds: value),
),
yield TimeScroller(
name: appLocale.durationInputSecondsLabel,
step: definition.input.seconds.step,
limit: _maxSeconds,
value: _remainingSeconds,
onChange: (value) => _handleChange(seconds: value),
);
}
}
Expand Down Expand Up @@ -219,12 +213,17 @@ class _TimeScrollerState extends State<TimeScroller> {
childDelegate: ListWheelChildBuilderDelegate(
builder: (BuildContext context, int index) {
final value = _indexToValue(index);
// safety check required because selected item cannot be retrieved on initial build
final isActive = index == (_scrollController.position.hasContentDimensions
? _scrollController.selectedItem
: _scrollController.initialItem
);
return Center(
child: AnimatedOpacity(
opacity: value == widget.value ? 1 : 0.3,
opacity: isActive ? 1 : 0.3,
duration: const Duration(milliseconds: 200),
child: AnimatedScale(
scale: value == widget.value ? 1 : 0.7,
scale: isActive ? 1 : 0.7,
duration: const Duration(milliseconds: 200),
child: Text(
value.toString().padLeft(2, '0'),
Expand All @@ -251,7 +250,7 @@ class _TimeScrollerState extends State<TimeScroller> {
);
}

int _clampIndex(int index) => (-index) % (widget.limit ~/ widget.step);
int _clampIndex(int index) => (-index) % (widget.limit / widget.step).ceil();

int _indexToValue(int index) => _clampIndex(index) * widget.step;

Expand Down

0 comments on commit 9b58268

Please sign in to comment.