Starboard Module Reference: ui_navigation.h

API to allow applications to take advantage of the platform's native UI engine. This is mainly to drive the animation of visual elements and to signal which of those elements have focus. The implementation should not render any visual elements; instead, it will be used to guide the app in where these elements should be drawn.

When the application creates the user interface, it will create SbUiNavItems for interactable elements. Additionally, the app must specify the position and size of these navigation items. As the app's user interface changes, it will create and destroy navigation items as appropriate.

For each render frame, the app will query the local transform for each SbUiNavItem in case the native UI engine moves individual items in response to user interaction. If the navigation item is a container, then the content offset will also be queried to determine the placement of its content items.

Macros

kSbUiNavItemInvalid

Well-defined value for an invalid navigation item.

Enums

SbUiNavItemType

Navigation items may be one of the following types. This must be specified upon item creation and may not change during the item's lifespan.

Values

  • kSbUiNavItemTypeFocus

    This is a single focusable item.

  • kSbUiNavItemTypeContainer

    This is a container of navigation items which can also be containers themselves or focusable items. Containers themselves cannot be focused.

Typedefs

SbUiNavItem

An opaque handle to an implementation-private structure representing a navigation item.

Definition

typedef struct SbUiNavItemPrivate* SbUiNavItem

Structs

SbUiNavCallbacks

This structure specifies all the callbacks which the platform UI engine should invoke for various interaction events on navigation items. These callbacks may be invoked from any thread at any frequency. The callback_context is the value that was passed on creation of the relevant SbUiNavItem.

Members

  • onblur

    void (*onblur)(SbUiNavItem item, void* callback_context);

    Invoke when an item has lost focus. This is only used with focus items.

  • onfocus

    void (*onfocus)(SbUiNavItem item, void* callback_context);

    Invoke when an item has gained focus. This is only used with focus items.

  • onscroll

    void (*onscroll)(SbUiNavItem item, void* callback_context);

    Invoke when an item's content offset is changed. This is only used with container items.

SbUiNavInterface

This structure declares the interface to the UI navigation implementation. All function pointers must be specified if the platform supports UI navigation.

Members

  • create_item

    SbUiNavItem (*create_item)(SbUiNavItemType type, const SbUiNavCallbacks * callbacks, void* callback_context);

    Create a new navigation item. When the user interacts with this item the appropriate SbUiNavCallbacks function will be invoked with the provided callback_context. An item is not interactable until it is enabled.

  • destroy_item

    void (*destroy_item)(SbUiNavItem item);

    Destroy the given navigation item. If this is a content of another item, then it will first be unregistered. Additionally, if this item contains other items, then those will be unregistered as well, but they will not be automatically destroyed.

  • set_focus

    void (*set_focus)(SbUiNavItem item);

    This is used to manually force focus on a navigation item of type kSbUiNavItemTypeFocus. Any previously focused navigation item should receive the blur event. If the item is not transitively a content of the root item, then this does nothing.

  • set_item_enabled

    void (*set_item_enabled)(SbUiNavItem item, bool enabled);

    This is used to enable or disable user interaction with the specified navigation item. All navigation items are disabled when created, and they must be explicitly enabled to allow user interaction. If a container is disabled, then all of its contents are not interactable even though they remain enabled. If enabled is false, it must be guaranteed that once this function returns, no callbacks associated with this item will be invoked until the item is re-enabled.

  • set_item_dir

    void (*set_item_dir)(SbUiNavItem item, SbUiNavItemDir dir);

    This specifies directionality for container items. Containers within containers do not inherit directionality. Directionality must be specified for each container explicitly.

  • set_item_size

    void (*set_item_size)(SbUiNavItem item, float width, float height);

    Set the interactable size of the specified navigation item. By default, an item's size is (0,0).

  • set_item_transform

    void (*set_item_transform)(SbUiNavItem item, const SbUiNavMatrix2x3 * transform);

    Set the transform for the navigation item and its contents if the item is a container. This specifies the placement of the item's center within its container. The transform origin is the center of the item. Distance is measured in pixels with the origin being the top-left of the item's container. By default, an item's transform is identity.

  • get_item_focus_transform

    bool (*get_item_focus_transform)(SbUiNavItem item, SbUiNavMatrix4 * out_transform);

    Retrieve the focus transform matrix for the navigation item. The UI engine may translate, rotate, and/or tilt focus items to reflect user interaction. This transform should be multiplied with the item's transform to get its position inside its container. The transform origin is the center of the item. Return false if the item position should not be changed (i.e. the transform should be treated as identity).

  • get_item_focus_vector

    bool (*get_item_focus_vector)(SbUiNavItem item, float* out_x, float* out_y);

    Retrieve a vector representing the focus location within a focused item. This is used to provide feedback about user input that is too small to result in a focus change. If there is no focus vector for the navigation item, then return false and leave out_x and out_y unchanged. Otherwise, return true and set the output values in the range of [-1, +1] with (out_x, out_y) of (-1, -1) being the top-left corner of the navigation item and (0, 0) being the center.

  • set_item_container_window

    void (*set_item_container_window)(SbUiNavItem item, SbWindow window);

    This attaches the given navigation item (which must be a container) to the specified window. Navigation items are only interactable if they are transitively attached to a window.

    A navigation item may only have a SbUiNavItem or SbWindow as its direct container. The navigation item hierarchy is established using set_item_container_item() with the root container attached to a SbWindow using set_item_container_window() to enable interaction with all enabled items in the hierarchy.

    If item is already registered with a different window, then this will unregister it from that window then attach it to the given window. It is an error to register more than one navigation item with any given window. If window is kSbWindowInvalid, then this will unregister the item from its current window if any. Upon destruction of item or window, the item is automatically unregistered from the window.

  • set_item_container_item

    void (*set_item_container_item)(SbUiNavItem item, SbUiNavItem container);

    A container navigation item may contain other navigation items. However, it is an error to have circular containment or for container to not be of type kSbUiNavItemTypeContainer. If item already has a different container, then this first severs that connection. If container is kSbUiNavItemInvalid, then this removes item from its current container. Upon destruction of item or container, the item is automatically removed from the container.

    The position of items within a container are specified relative to the container's position. The position of these content items are further modified by the container's "content offset".

    For example, consider item A with position (5,5) and content offset (0,0). Given item B with position (10,10) is registered as a content of item A.

    1) Item B should be drawn at position (15,15).

    2) If item A's content offset is changed to (10,0), then item B should be drawn at position (5,15).

    Essentially, content items should be drawn at: [container position] + [content position] - [container content offset]

  • set_item_content_offset

    void (*set_item_content_offset)(SbUiNavItem item, float content_offset_x, float content_offset_y);

    Set the current content offset for the given container. This may be used to force scrolling to make certain content items visible. A container item's content offset helps determine where its content items should be drawn. Essentially, a content item should be drawn at: [container position] + [content position] - [container content offset] If item is not a container, then this does nothing. By default, the content offset is (0,0).

  • get_item_content_offset

    void (*get_item_content_offset)(SbUiNavItem item, float* out_content_offset_x, float* out_content_offset_y);

    Retrieve the current content offset for the navigation item. If item is not a container, then the content offset is (0,0).

SbUiNavItemDir

Navigation items of type kSbUiNavItemTypeContainer have directionality. If directionality is not specified for a container, it should default to left-to- right and top-to-bottom.

For left-to-right, content offset x = 0 shows the leftmost content. < – Container Size--> +----------------- – +----------------- – +----------------- – + Not selectable. Selectable. Selectable. Offscreen. Onscreen. Offscreen. Negative position. Positive position. Positive position. +----------------- – +----------------- – +----------------- – + ^ Content Offset X = 0.

For right-to-left, content offset x = 0 shows the rightmost content. < – Container Size--> +----------------- – +----------------- – +----------------- – + Selectable. Selectable. Not selectable. Offscreen. Onscreen. Offscreen. Negative position. Positive position. Positive position. +----------------- – +----------------- – +----------------- – + ^ Content Offset X = 0.

Top-to-bottom is similar to left-to-right, but for the Y position. Bottom-to-top is similar to right-to-left, but for the Y position.

Members

  • bool is_left_to_right
  • bool is_top_to_bottom

SbUiNavMatrix2x3

This represents a 2x3 transform matrix in row-major order. a b tx c d ty

Members

  • float m

SbUiNavMatrix4

This represents a 4x4 transform matrix in row-major order.

Members

  • float m

Functions

SbUiNavGetInterface

Retrieve the platform's UI navigation implementation. If the platform does not provide one, then return false without modifying out_interface. Otherwise, initialize all members of out_interface and return true.

Declaration

bool SbUiNavGetInterface(SbUiNavInterface *out_interface)

SbUiNavItemIsValid

Returns whether the given navigation item handle is valid.

Declaration

static bool SbUiNavItemIsValid(SbUiNavItem item)