Controller that allows to visually comparing two sets of layers by displaying them on either side of a swipe line. By moving the swipe line, different parts of the layer sets are revealed and hidden. This allows easily spotting differences between the layer sets.

Swiping is done by dragging the swipe line using the mouse from left-to-right or top-to-bottom, depending on the swipe line orientation. The SwipeController can automatically switch between horizontal and vertical orientations.

Swipe controller usage
SwipeController in action

Usage:

import {SwipeController} from "@luciad/ria/view/controller/SwipeController.js";

const swipeController = new SwipeController();
map.controller = swipeController;

// the SampleSwipeUI allows the user to select layers, but you can also do it programmatically
const leftLayers = [blackMarbleLayer];
const rightLayers = [globalImageryLayer];
swipeController.layers = [leftLayers, rightLayers];

Note that you can only use the SwipeController on a WebGLMap. It also requires support for certain WebGL extensions. You can open the "LuciadRIA WebGLMap support" sample on a device you're targeting to check if these requirements are met.

The SwipeController provides no out-of-the-box UI. You can use the sample UI implementation from samples/common/ui/controllers/ui/SampleSwipeUI as-is. It can be re-styled using CSS variables. You can also use it as a reference to create your own UI on top of the SwipeController API.

You can customize the controller to respond to keyboard events as follows:

import {SwipeController} from "@luciad/ria/view/controller/SwipeController.js";
import {HandleEventResult} from "@luciad/ria/view/controller/HandleEventResult.js";
import {KeyEvent} from "@luciad/ria/view/input/KeyEvent.js";
import {KeyEventType} from "@luciad/ria/view/input/KeyEventType.js";

/**
* A SwipeController that moves the swipe line left/right with the arrow keys.
*/
class ArrowKeySwipeController extends SwipeController {

constructor() {
super();
}

onKeyEvent(keyEvent: KeyEvent): HandleEventResult {
if (keyEvent.type === KeyEventType.DOWN && keyEvent.domEvent?.key === "ArrowLeft") {
const newLocation = this.swipeLineLocation.copy();
newLocation.translate2D(-50, 0);
this.swipeLineLocation = newLocation;
return HandleEventResult.EVENT_HANDLED;
} else if (keyEvent.type === KeyEventType.DOWN && keyEvent.domEvent?.key === "ArrowRight") {
const newLocation = this.swipeLineLocation.copy();
newLocation.translate2D(50, 0);
this.swipeLineLocation = newLocation;
return HandleEventResult.EVENT_HANDLED;
}
return HandleEventResult.EVENT_IGNORED;
}

}

map.controller = new ArrowKeySwipeController();

Since

2021.0

Hierarchy (view full)

Constructors

Accessors

  • get automaticOrientation(): boolean
  • Returns boolean

  • set automaticOrientation(enabled): void
  • Sets whether the controller is allowed to automatically change the swipe line orientation when dragging the mouse.

    By default automatic orientation changes are allowed.

    Parameters

    • enabled: boolean

    Returns void

  • get cursor(): null | string
  • The CSS cursor to use on the map, for this controller. If null, the map will fall back to the previous cursor that was set on the map.

    Note that changing this cursor will update the cursor on the map's DOM node. When using multiple controllers (e.g. in a CompositeController), the controller that updates the cursor last (to a non-null value), will override any other non-null cursors of active controllers on the map.

    Returns null | string

    See

    Map.cursorManager

    Since

    2022.1

  • set cursor(cssCursor): void
  • Parameters

    • cssCursor: null | string

    Returns void

  • get hovering(): boolean
  • Indicates if the mouse is hovering the swipe line. You can use this to change the styling of the swipe line UI, or update the cursor.

    Returns boolean

    Since

    2021.0

  • get layers(): [Layer[], Layer[]]
  • Returns [Layer[], Layer[]]

  • set layers(val): void
  • Sets the two sets of layers to swipe.

    Note that layers in the view that are not specified here are not affected. This for example means that if you swipe between layers A and C, but layer B appears in-between layer A and C, that the swipe controller will turn the left part of A visible and the right part of C visible, but that B will obstruct C and the swiping will appear to happen between A and B as opposed to A and C. To overcome this, you can swipe between consecutive layers. In the example this would mean that you swipe between the collections {A,B} and {C}.

    Layers that are not mentioned in any of the two layer sets, are always visible.

    If you want to swipe just one layer, put the one layer in its own layer set, and leave the other layer set empty.

    swipeController.layers = [[layerToSwipe], []];
    

    Parameters

    Returns void

  • get map(): null | Map
  • The map on which this controller is currently active or null if this controller is not currently active. This property is read-only.

    Returns null | Map

  • set map(_value): void
  • Parameters

    • _value: null | Map

    Returns void

  • get swipeLineLocation(): Point
  • Returns Point

  • set swipeLineLocation(location): void
  • Sets the swipe line location in view coordinates. If the swipe line has a horizontal orientation, only the y coordinate is relevant. If the swipe line has a vertical orientation, the x coordinate is considered.

    For view coordinates, the reference of the point is null.

    Parameters

    • location: Point

      The x-coordinate is relevant when the swipe line has vertical orientation and the y-coordinate is relevant when the swipe line has horizontal orientation.

    Returns void

  • get swipeLineOrientation(): SwipeLineOrientation
  • Returns SwipeLineOrientation

  • set swipeLineOrientation(orientation): void
  • Sets the orientation of the swipe line. A horizontal swipe line means that the line moves from the left to the right side of the view and that layers appear in the top- or bottom-half of the view. A vertical swipe line means that the line moves from top to bottom of the view and the layers are clipped to appear on the left or right side of the view.

    Parameters

    Returns void

  • get swiping(): boolean
  • Indicates if the user is swiping (dragging the swipe line). You can use this to change the styling of the swipe line UI, or update the cursor.

    Returns boolean

    Since

    2021.0

Methods

  • Call this method to indicate that the controller's appearance has changed. Calling this method ensures the onDraw will be called during the next rendering pass.

    Returns void

  • Callback that is invoked when this controller is activated on a map. This method allows controller implementations to perform setup work.

    Parameters

    • map: Map

      the map on which the controller has been activated

    Returns void

  • Callback that is invoked when this controller is deactivated on a map. This method allows controller implementations to perform cleanup work. This method must return either any resolved value or a promise to indicate completion of deactivation. This allows controller implementation to perform asynchronous deactivation work. During the period between this method being called and the resolution of the deactivation promise, this controller will no longer receive input events, but will still get the opportunity to draw itself.

    Parameters

    • map: Map

      the map on which the controller has been deactivated

    Returns void | Promise<void>

    a concrete value to indicate immediate deactivation or a deactivation promise.

  • Callback that allows controller implementations to perform custom drawing on the map. Controller shapes and icons are drawn on top of all other content in the map. Note that the map may perform caching which may cause this method to only be invoked once. When a controller implementation's appearance changes the implementation should call invalidate on itself.

    Parameters

    • geoCanvas: GeoCanvas

      the GeoCanvas on which the controller can draw shapes.

    Returns void

  • Callback that allows controller implementations to draw labels on the map. Note that the map may perform caching which may cause this method to only be invoked once. When a controller implementation's appearance changes the implementation should call invalidate on itself.

    Parameters

    • labelCanvas: LabelCanvas

      the LabelCanvas on which the controller can draw labels.

    Returns void

  • Called when a gesture event has been received. This method must return a HandleEventResult value to indicate if the event was handled or not, If this method returns EVENT_IGNORED, the map will be given the opportunity to perform default gesture event behaviour. If default event handling is not desired, this method should return EVENT_HANDLED. (See the Controller class description for the default behavior.)

    Parameters

    Returns HandleEventResult

    the gesture event handling result.

  • Called when a key event has been received. This method must return a HandleEventResult value to indicate if the event was handled or not, If this method returns EVENT_IGNORED, the map will be given the opportunity to perform default key event behaviour. If default event handling is not desired, this method should return EVENT_HANDLED. (See the Controller class description for the default behavior.)

    Parameters

    • keyEvent: KeyEvent

      The key event to be handled. Note that this is a KeyEvent and not a DOMEvent. You can access the corresponding DOMEvent through KeyEvent.domEvent.

    Returns HandleEventResult

    The key event handling result.

Events

"LayersChange" event

  • on("LayersChange", callback: ((layers) => void)) : Handle
  • An event that is fired when the layers change

    Parameters

    • event: "LayersChange"
    • callback: ((layers) => void)
        • (layers): void
        • Parameters

          Returns void

    Returns Handle

    See

    SwipeController.layers

    Since

    2021.0

"SwipeLineLocationChange" event

  • on("SwipeLineLocationChange", callback: ((swipeLineLocation) => void)) : Handle
  • An event that is fired when the location of the swipe line changes

    Parameters

    • event: "SwipeLineLocationChange"
    • callback: ((swipeLineLocation) => void)
        • (swipeLineLocation): void
        • Parameters

          Returns void

    Returns Handle

"SwipeLineOrientationChange" event

  • on("SwipeLineOrientationChange", callback: ((swipeLineOrientation) => void)) : Handle
  • An event that is fired when the orientation of the swipe line changes

    Parameters

    • event: "SwipeLineOrientationChange"
    • callback: ((swipeLineOrientation) => void)

    Returns Handle

"AutomaticOrientationChange" event

  • on("AutomaticOrientationChange", callback: ((automaticSwipeLineOrientation) => void)) : Handle
  • An event that is fired when the automatic swipe line orientation setting changes

    Parameters

    • event: "AutomaticOrientationChange"
    • callback: ((automaticSwipeLineOrientation) => void)
        • (automaticSwipeLineOrientation): void
        • Parameters

          • automaticSwipeLineOrientation: boolean

          Returns void

    Returns Handle

"HoveringChanged" event

  • on("HoveringChanged", callback: ((isHovering) => void)) : Handle
  • An event that is fired when the mouse is (no longer) hovering over the swipe line.

    You can use this to change the styling of the swipe line, or update the cursor.

    Parameters

    • event: "HoveringChanged"
    • callback: ((isHovering) => void)
        • (isHovering): void
        • Parameters

          • isHovering: boolean

          Returns void

    Returns Handle

    See

    SwipeController.hovering

    Since

    2021.0

"SwipingChanged" event

  • on("SwipingChanged", callback: ((isSwiping) => void)) : Handle
  • An event that is fired when the user is (no longer) swiping (dragging the swipe line).

    You can use this to change the styling of the swipe line, or update the cursor.

    Parameters

    • event: "SwipingChanged"
    • callback: ((isSwiping) => void)
        • (isSwiping): void
        • Parameters

          • isSwiping: boolean

          Returns void

    Returns Handle

    See

    SwipeController.swiping

    Since

    2021.0

"Invalidated" event

  • on("Invalidated", callback: (() => void)) : Handle
  • Parameters

    • event: "Invalidated"
    • callback: (() => void)
        • (): void
        • Returns void

    Returns Handle

"Activated" event

  • on("Activated", callback: ((map) => void)) : Handle
  • Parameters

    • event: "Activated"
    • callback: ((map) => void)
        • (map): void
        • Parameters

          Returns void

    Returns Handle

"Deactivated" event

  • on("Deactivated", callback: ((map) => void)) : Handle
  • Parameters

    • event: "Deactivated"
    • callback: ((map) => void)
        • (map): void
        • Parameters

          Returns void

    Returns Handle