Skip to content
Snippets Groups Projects
Commit 4a635bc8 authored by Tobias Pietzsch's avatar Tobias Pietzsch
Browse files

add OverlayAnimator interface. ViewerPanel has a list of OverlayAnimators.

ViwerPanel.addOverlayAnimator(animator) adds a new one.
When animator.isComplete() it is removed.
parent 19083a3f
No related branches found
No related tags found
No related merge requests found
......@@ -46,6 +46,7 @@ import bdv.img.cache.Cache;
import bdv.util.Affine3DHelpers;
import bdv.viewer.animate.AbstractTransformAnimator;
import bdv.viewer.animate.MessageOverlayAnimator;
import bdv.viewer.animate.OverlayAnimator;
import bdv.viewer.animate.RotationAnimator;
import bdv.viewer.animate.TextOverlayAnimator;
import bdv.viewer.animate.TextOverlayAnimator.TextPosition;
......@@ -145,9 +146,11 @@ public class ViewerPanel extends JPanel implements OverlayRenderer, TransformLis
protected AbstractTransformAnimator currentAnimator = null;
/**
* Currently only used to show initial "press F1 for help" message.
* A list of currently incomplete (see {@link OverlayAnimator#isComplete()})
* animators. Initially, this contains a {@link TextOverlayAnimator} showing
* the "press F1 for help" message.
*/
protected TextOverlayAnimator animatedOverlay;
protected ArrayList< OverlayAnimator > overlayAnimators;
/**
* Fade-out overlay of recent messages. See {@link #showMessage(String)}.
......@@ -305,7 +308,10 @@ public class ViewerPanel extends JPanel implements OverlayRenderer, TransformLis
transformListeners = new CopyOnWriteArrayList< TransformListener< AffineTransform3D > >();
msgOverlay = optional.msgOverlay;
animatedOverlay = new TextOverlayAnimator( "Press <F1> for help.", 3000, TextPosition.CENTER );
overlayAnimators = new ArrayList< OverlayAnimator >();
overlayAnimators.add( msgOverlay );
overlayAnimators.add( new TextOverlayAnimator( "Press <F1> for help.", 3000, TextPosition.CENTER ) );
display.addComponentListener( new ComponentAdapter()
{
......@@ -407,23 +413,20 @@ public class ViewerPanel extends JPanel implements OverlayRenderer, TransformLis
g.setFont( new Font( "Monospaced", Font.PLAIN, 12 ) );
g.drawString( mousePosGlobalString, ( int ) g.getClipBounds().getWidth() - 170, 25 );
if ( animatedOverlay != null )
{
animatedOverlay.paint( ( Graphics2D ) g, System.currentTimeMillis() );
if ( animatedOverlay.isComplete() )
animatedOverlay = null;
else
display.repaint();
}
boolean requiresRepaint = multiBoxOverlayRenderer.isHighlightInProgress();
if ( !msgOverlay.isComplete() )
final long currentTimeMillis = System.currentTimeMillis();
final ArrayList< OverlayAnimator > overlayAnimatorsToRemove = new ArrayList< OverlayAnimator >();
for ( final OverlayAnimator animator : overlayAnimators )
{
msgOverlay.paint( ( Graphics2D ) g, System.currentTimeMillis() );
if ( !msgOverlay.isComplete() )
display.repaint();
animator.paint( ( Graphics2D ) g, currentTimeMillis );
requiresRepaint |= animator.requiresRepaint();
if ( animator.isComplete() )
overlayAnimatorsToRemove.add( animator );
}
overlayAnimators.removeAll( overlayAnimatorsToRemove );
if ( multiBoxOverlayRenderer.isHighlightInProgress() )
if ( requiresRepaint )
display.repaint();
}
......@@ -636,6 +639,20 @@ public class ViewerPanel extends JPanel implements OverlayRenderer, TransformLis
display.repaint();
}
/**
* Add a new {@link OverlayAnimator} to the list of animators. The animation
* is immediately started. The new {@link OverlayAnimator} will remain in
* the list of animators until it {@link OverlayAnimator#isComplete()}.å
*
* @param animator
* animator to add.
*/
public void addOverlayAnimator( final OverlayAnimator animator )
{
overlayAnimators.add( animator );
display.repaint();
}
/**
* Add a {@link TransformListener} to notify about viewer transformation
* changes. Listeners will be notified <em>before</em> calling
......
......@@ -12,7 +12,7 @@ import bdv.viewer.ViewerFrame;
* @author Tobias Pietzsch <tobias.pietzsch@gmail.com>
* @author Jean-Yves Tinevez <jeanyves.tinevez@gmail.com>
*/
public abstract class AbstractAnimator
public class AbstractAnimator
{
/** Expected duration length of the animation (in time units). */
private final long duration;
......
......@@ -17,7 +17,7 @@ import java.util.List;
*
* @author Tobias Pietzsch <tobias.pietzsch@gmail.com>
*/
public class MessageOverlayAnimator
public class MessageOverlayAnimator implements OverlayAnimator
{
protected static class TextAnimator extends AbstractAnimator
{
......@@ -64,14 +64,24 @@ public class MessageOverlayAnimator
texts.add( 0, new TextAnimator( text, duration ) );
}
@Override
public boolean isComplete()
{
return texts.isEmpty();
// We this animator should not be removed, ever.
return false;
}
@Override
public boolean requiresRepaint()
{
return !texts.isEmpty();
}
@Override
public void paint( final Graphics2D g, final long time )
{
if ( isComplete() )
if ( !requiresRepaint() )
return;
final double ox = g.getClipBounds().getWidth() - 10;
......
package bdv.viewer.animate;
import java.awt.Graphics2D;
public interface OverlayAnimator
{
public abstract void paint( final Graphics2D g, final long time );
/**
* Returns true if the animation is complete and the animator can be
* removed.
*
* @return whether the animation is complete and the animator can be
* removed.
*/
public boolean isComplete();
/**
* Returns true if the animator requires an immediate repaint to continue
* the animation.
*
* @return whetherhe animator requires an immediate repaint.
*/
public boolean requiresRepaint();
}
......@@ -13,7 +13,7 @@ import java.awt.geom.Rectangle2D;
*
* @author Tobias Pietzsch <tobias.pietzsch@gmail.com>
*/
public class TextOverlayAnimator extends AbstractAnimator
public class TextOverlayAnimator extends AbstractAnimator implements OverlayAnimator
{
protected final Font font;
......@@ -56,6 +56,7 @@ public class TextOverlayAnimator extends AbstractAnimator
this.position = position;
}
@Override
public void paint( final Graphics2D g, final long time )
{
setTime( time );
......@@ -87,4 +88,10 @@ public class TextOverlayAnimator extends AbstractAnimator
g.setColor( new Color( 1f, 1f, 1f, alpha ) );
layout.draw( g, x, y );
}
@Override
public boolean requiresRepaint()
{
return !isComplete();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment