34 lines
884 B
Dart
34 lines
884 B
Dart
/// Routes vertical D-pad movement between ordered hub rows.
|
|
///
|
|
/// A valid target and the bottom boundary are consumed. The top boundary can
|
|
/// either invoke an explicit focus handoff or propagate to the row's
|
|
/// `onNavigateUp` callback.
|
|
bool navigateVerticalHubRows({
|
|
required int hubCount,
|
|
required int hubIndex,
|
|
required bool isUp,
|
|
required void Function(int targetIndex) requestFocus,
|
|
void Function()? onTopBoundary,
|
|
void Function()? onBottomBoundary,
|
|
bool propagateTopBoundary = false,
|
|
}) {
|
|
if (hubCount <= 0) return false;
|
|
|
|
final targetIndex = isUp ? hubIndex - 1 : hubIndex + 1;
|
|
if (targetIndex < 0) {
|
|
if (onTopBoundary != null) {
|
|
onTopBoundary();
|
|
return true;
|
|
}
|
|
return !propagateTopBoundary;
|
|
}
|
|
|
|
if (targetIndex >= hubCount) {
|
|
onBottomBoundary?.call();
|
|
return true;
|
|
}
|
|
|
|
requestFocus(targetIndex);
|
|
return true;
|
|
}
|