Files
plezy/lib/focus/hub_vertical_navigation.dart
T

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;
}