From b5ef9255a883509b3792f8e4498f8212f2131d5d Mon Sep 17 00:00:00 2001 From: Stefan Hahmann Date: Fri, 11 Jul 2025 12:41:09 +0200 Subject: [PATCH] Prevent overly frequent navigation requests in OverlayNavigation. Reasoning: Big Data Viewer may get stuck, if navigation requests are sent to it too frequently --- .../views/bdv/overlay/OverlayNavigation.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/mastodon/views/bdv/overlay/OverlayNavigation.java b/src/main/java/org/mastodon/views/bdv/overlay/OverlayNavigation.java index 073771222..ae4864614 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/OverlayNavigation.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/OverlayNavigation.java @@ -46,6 +46,10 @@ public class OverlayNavigation< V extends OverlayVertex< V, E >, E extends Overl private NavigationBehaviour< V, E > navigationBehaviour; + private long lastNavigationTime = 0; + + private static final int ANIMATION_DURATION = 300; + public OverlayNavigation( final AbstractViewerPanel panel, final OverlayGraph< V, E > graph ) @@ -82,6 +86,9 @@ public void setNavigationEtiquette( final NavigationEtiquette navigationEtiquett @Override public void navigateToVertex( final V vertex ) { + if (shouldThrottle()) + return; // Throttle navigation requests. + // Always move in T. final int tp = vertex.getTimepoint(); panel.state().setCurrentTimepoint( tp ); @@ -90,17 +97,20 @@ public void navigateToVertex( final V vertex ) final double[] target = navigationBehaviour.navigateToVertex( vertex, currentTransform ); if ( target != null ) { - final TranslationAnimator animator = new TranslationAnimator( currentTransform, target, 300 ); - animator.setTime( System.currentTimeMillis() ); + final TranslationAnimator animator = new TranslationAnimator( currentTransform, target, ANIMATION_DURATION ); + lastNavigationTime = System.currentTimeMillis(); + animator.setTime( lastNavigationTime ); panel.setTransformAnimator( animator ); } - panel.requestRepaint(); } @Override public void navigateToEdge( final E edge ) { + if ( shouldThrottle() ) + return; // Throttle navigation requests. + // Always move in T. final V ref = graph.vertexRef(); final int tp = edge.getTarget( ref ).getTimepoint(); @@ -111,14 +121,21 @@ public void navigateToEdge( final E edge ) final double[] target = navigationBehaviour.navigateToEdge( edge, currentTransform ); if ( target != null ) { - final TranslationAnimator animator = new TranslationAnimator( currentTransform, target, 300 ); - animator.setTime( System.currentTimeMillis() ); + final TranslationAnimator animator = new TranslationAnimator( currentTransform, target, ANIMATION_DURATION ); + lastNavigationTime = System.currentTimeMillis(); + animator.setTime( lastNavigationTime ); panel.setTransformAnimator( animator ); } panel.requestRepaint(); } + private boolean shouldThrottle() + { + final long now = System.currentTimeMillis(); + return ( now - lastNavigationTime < ANIMATION_DURATION ); + } + /* * Navigation behaviours */