diff --git a/imageviewer-addon/src/main/java/org/tepi/imageviewer/ImageViewer.java b/imageviewer-addon/src/main/java/org/tepi/imageviewer/ImageViewer.java index a857377..1ab0fdb 100644 --- a/imageviewer-addon/src/main/java/org/tepi/imageviewer/ImageViewer.java +++ b/imageviewer-addon/src/main/java/org/tepi/imageviewer/ImageViewer.java @@ -6,6 +6,7 @@ import java.util.LinkedList; import java.util.List; +import org.tepi.imageviewer.client.Directions; import org.tepi.imageviewer.client.ImageViewerServerRpc; import org.tepi.imageviewer.client.ImageViewerState; @@ -62,8 +63,17 @@ public void centerImageSelected(int newCenterImageIndex) { } } } + /** + * rpc call to reset the move direction + */ + @Override + public void moveFinished() { + ImageViewer.this.getState().direction = Directions.NODIRECTION; + } }; + + /** * Default constructor of ImageViewer. * @@ -90,6 +100,15 @@ protected ImageViewerState getState() { return (ImageViewerState) super.getState(); } + /** + * Trigger a movement of the current image to the left/right. Will trigger the animation, if the animation is enabled. + * + * @param direction The direction the images will scroll. + */ + public void move(Directions direction) { + this.getState().direction = direction; + } + /** * Returns (an unmodifiable) copy of the list of images currently set to * this ImageViewer. diff --git a/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/Directions.java b/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/Directions.java new file mode 100644 index 0000000..d8f37b0 --- /dev/null +++ b/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/Directions.java @@ -0,0 +1,9 @@ +package org.tepi.imageviewer.client; + +/** + * possible move directions + */ +public enum Directions { + + LEFT, RIGHT, NODIRECTION +} diff --git a/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerConnector.java b/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerConnector.java index 35eb27f..eee6e9c 100644 --- a/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerConnector.java +++ b/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerConnector.java @@ -30,6 +30,17 @@ public void onStateChanged(StateChangeEvent stateChangeEvent) { if (getWidget().animationRunning) { return; } + + /* + * If the direction changed then move the images and signal the server the movement finished. + * Skip the rest to prevent the re-rendering of all images. + */ + if (stateChangeEvent.hasPropertyChanged("direction") && !Directions.NODIRECTION.equals(getState().direction)) { + getWidget().move(getState().direction); + this.moveFinished(); + return; + } + getWidget().mouseOverEffects = getState().mouseOverEffects; getWidget().amountOfImages = getState().imageCount; getWidget().centerImageIndex = getState().centerImageIndex; @@ -73,4 +84,11 @@ public void layout() { public void centerImageSelected(int imageIndex) { rpc.centerImageSelected(imageIndex); } + + /** + * makes and rpc call to signal that the movement is finished + */ + private void moveFinished() { + rpc.moveFinished(); + } } \ No newline at end of file diff --git a/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerServerRpc.java b/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerServerRpc.java index 59168b7..6a94117 100644 --- a/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerServerRpc.java +++ b/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerServerRpc.java @@ -5,4 +5,6 @@ public interface ImageViewerServerRpc extends ServerRpc { public void centerImageSelected(int newCenterImageIndex); + + public void moveFinished(); } diff --git a/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerState.java b/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerState.java index 0901738..c70f9df 100644 --- a/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerState.java +++ b/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/ImageViewerState.java @@ -28,4 +28,6 @@ public class ImageViewerState extends TabIndexState { public boolean mouseOverEffects; /** Amount of images added to the viewer */ public int imageCount; + /** Move Direction */ + public Directions direction = Directions.NODIRECTION; } diff --git a/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/VImageViewer.java b/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/VImageViewer.java index d5ea3d3..fee8a8d 100644 --- a/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/VImageViewer.java +++ b/imageviewer-addon/src/main/java/org/tepi/imageviewer/client/VImageViewer.java @@ -334,6 +334,20 @@ void fixSideImageCount() { } } + /** + * Moves the current image one step left or right. Animates the movement if animations are enabled. + * + * @param direction - + */ + public void move(Directions direction) { + if (direction.equals(Directions.LEFT)) { + moveImages(true); + } + else { + moveImages(false); + } + } + /** * Moves the image set one step left or right. Animates the movement if * animations are enabled. diff --git a/imageviewer-demo/src/main/java/org/tepi/imageviewer/demo/ImageViewerDemoUI.java b/imageviewer-demo/src/main/java/org/tepi/imageviewer/demo/ImageViewerDemoUI.java index e119d3c..7ab3f22 100644 --- a/imageviewer-demo/src/main/java/org/tepi/imageviewer/demo/ImageViewerDemoUI.java +++ b/imageviewer-demo/src/main/java/org/tepi/imageviewer/demo/ImageViewerDemoUI.java @@ -7,16 +7,19 @@ import org.tepi.imageviewer.ImageViewer; import org.tepi.imageviewer.ImageViewer.ImageSelectionListener; +import org.tepi.imageviewer.client.Directions; import com.vaadin.annotations.Theme; import com.vaadin.annotations.Title; import com.vaadin.annotations.VaadinServletConfiguration; +import com.vaadin.icons.VaadinIcons; import com.vaadin.server.Resource; import com.vaadin.server.ThemeResource; import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinServlet; import com.vaadin.shared.ui.ContentMode; import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; import com.vaadin.ui.CheckBox; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; @@ -192,6 +195,18 @@ private Layout createControls() { selectedImage.setWidth("50px"); hl.addComponent(selectedImage); hl.setComponentAlignment(selectedImage, Alignment.BOTTOM_CENTER); + + Button moveLeft = new Button(VaadinIcons.ARROW_LEFT); + moveLeft.setDescription("Move image left"); + moveLeft.addClickListener(event -> this.imageViewer.move(Directions.LEFT)); + hl.addComponent(moveLeft); + hl.setComponentAlignment(moveLeft, Alignment.BOTTOM_CENTER); + + Button moveRight = new Button(VaadinIcons.ARROW_RIGHT); + moveRight.setDescription("Move image right"); + moveRight.addClickListener(event -> this.imageViewer.move(Directions.RIGHT)); + hl.addComponent(moveRight); + hl.setComponentAlignment(moveRight, Alignment.BOTTOM_CENTER); return hl; }