simvx.core.ui.virtual_scroll

VirtualScrollContainer – only renders visible items for large lists.

Items are provided via a data source callback. Only items within the visible viewport range are instantiated and laid out, enabling efficient handling of thousands of items.

Module Contents

Classes

VirtualScrollContainer

ScrollContainer that only renders visible items.

Data

API

simvx.core.ui.virtual_scroll.log

‘getLogger(…)’

simvx.core.ui.virtual_scroll.__all__

[‘VirtualScrollContainer’]

class simvx.core.ui.virtual_scroll.VirtualScrollContainer(item_height: float = 24.0, show_scrollbar: bool = False, **kwargs)[source]

Bases: simvx.core.ui.containers.Container

ScrollContainer that only renders visible items.

Items are provided via a data source callback. Only items within the visible viewport range are instantiated and laid out. Off-screen items are recycled to minimize allocation.

Set show_scrollbar = True to display a vertical scrollbar thumb when content overflows (default False).

Example: vs = VirtualScrollContainer(item_height=24.0, show_scrollbar=True) vs.size = Vec2(300, 400)

def make_label(index, recycled):
    from simvx.core.ui.widgets import Label
    lbl = recycled or Label()
    lbl.text = f"Item {index}"
    return lbl

vs.set_data_source(10000, make_label)

Initialization

clip_contents

‘Property(…)’

size_x

‘Property(…)’

size_y

‘Property(…)’

scrollbar_colour

‘ThemeColour(…)’

scrollbar_track_colour

‘ThemeColour(…)’

set_data_source(count: int, factory: collections.abc.Callable[[int, simvx.core.ui.core.Control | None], simvx.core.ui.core.Control], data_fn: collections.abc.Callable[[int], Any] | None = None)[source]

Configure the virtual list.

Args: count: Total number of items. factory: Creates/updates a Control for item at index. Signature: fn(index, existing_or_None) -> Control data_fn: Optional callback returning data for item at index.

update_item_count(count: int)[source]

Update total item count and refresh visible items.

property total_height: float[source]

Total content height based on item count and row height.

property visible_range: tuple[int, int][source]

Return (first_visible_index, last_visible_index_exclusive).

scroll_to(offset: float)[source]

Scroll to absolute pixel offset.

scroll_to_index(index: int)[source]

Scroll so the item at index is at the top of the viewport.

on_scroll(delta: float)[source]

Handle scroll wheel input (positive delta = scroll down).

on_draw(renderer)[source]
separation

‘Property(…)’

on_enter_tree()
on_ready()
on_exit_tree()
add_child(node: simvx.core.node.T) simvx.core.node.T
remove_child(node: simvx.core.node.Node) None
mark_layout_dirty()
min_size_x

‘Property(…)’

min_size_y

‘Property(…)’

anchor_left

‘Property(…)’

anchor_top

‘Property(…)’

anchor_right

‘Property(…)’

anchor_bottom

‘Property(…)’

margin_left

‘Property(…)’

margin_top

‘Property(…)’

margin_right

‘Property(…)’

margin_bottom

‘Property(…)’

dismiss_on_outside_click

‘Property(…)’

focus_mode

‘Property(…)’

tooltip

‘Property(…)’

mouse_filter

‘Property(…)’

size_flags_horizontal

‘Property(…)’

size_flags_vertical

‘Property(…)’

stretch_ratio

‘Property(…)’

max_size

‘Property(…)’

property size: simvx.core.math.types.Vec2
property min_size: simvx.core.math.types.Vec2
content_signature() object
content_uses(chars: str) bool
autosize_to_content() None
touch_mode: str

‘mouse’

property theme: simvx.core.ui.types.Theme | None
property mouse_over: bool
property focused: bool
property disabled: bool
get_theme() simvx.core.ui.types.Theme
queue_redraw()
get_minimum_size() simvx.core.math.types.Vec2
get_rect() tuple[float, float, float, float]
get_global_rect() tuple[float, float, float, float]
is_point_inside(point) bool
place_bottom_strip(height: float) None
place_top_strip(height: float) None
set_anchor_preset(preset: simvx.core.ui.enums.AnchorPreset)
activate() bool
set_focus()
grab_focus()
release_focus()
has_focus() bool
focus_next_control()
focus_previous_control()
grab_mouse()
release_mouse()
set_drag_preview(control: simvx.core.ui.core.Control)
property is_overlay_open: bool
show_overlay(modality: str = 'light', *, dim: bool | None = None, dismiss: bool | None = None, inert: bool | None = None, owner: simvx.core.ui.core.Control | None = None, initial_focus: simvx.core.ui.core.Control | None = None) None
close_overlay() None
position

‘_SpatialVecProperty(…)’

rotation

‘Property(…)’

scale

‘_SpatialVecProperty(…)’

z_index

‘Property(…)’

z_as_relative

‘Property(…)’

render_layer

‘Property(…)’

set_render_layer(index: int, enabled: bool = True) None
is_on_render_layer(index: int) bool
property absolute_z_index: int
property rotation_degrees: float
property world_position: simvx.core.math.types.Vec2
property world_rotation: float
property world_scale: simvx.core.math.types.Vec2
property world_transform: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float]
property forward: simvx.core.math.types.Vec2
property right: simvx.core.math.types.Vec2
translate(offset: tuple[float, float] | numpy.ndarray)
rotate(radians: float)
rotate_deg(degrees: float)
look_at(target: tuple[float, float] | numpy.ndarray)
transform_points(points: list[simvx.core.math.types.Vec2]) list[simvx.core.math.types.Vec2]
draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None)
wrap_screen(margin: float = 20)
hdr

‘Property(…)’

property transform_render_dirty: bool
strict_errors: ClassVar[bool]

True

dev_checks: ClassVar[bool]

None

script_error_raised

‘Signal(…)’

dynamic: bool

False

visible

‘Property(…)’

update_mode

‘Property(…)’

__properties__: ClassVar[dict[str, simvx.core.descriptors.Property]]

None

classmethod __init_subclass__(**kwargs)
property name: str
property visible_in_tree: bool
reset_error() None
reparent(new_parent: simvx.core.node.Node)
node_at(path, default=_NO_DEFAULT)
find(target, *, direct: bool = False)
find_all(target, *, direct: bool = False)
expect(target, *, direct: bool = False)
ancestor(target)
walk(*, include_self: bool = True) collections.abc.Iterator[simvx.core.node.Node]
property path: str
property is_scene_root: bool
add_to_group(group: str)
remove_from_group(group: str)
is_in_group(group: str) bool
on_update(dt: float) None
on_fixed_update(dt: float) None
on_picked(event: simvx.core.events.InputEvent) None
on_unhandled_input(event: simvx.core.events.TreeInputEvent) None
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle
stop_coroutine(gen_or_handle)
property render_dirty: bool
clear_children()
destroy()
property destroying: bool
call_deferred(method: collections.abc.Callable[..., Any], *args: Any) None
property app
property tree: simvx.core.scene_tree.SceneTree
property physics
property physics_2d
__getitem__(key: str)
classmethod get_properties() dict[str, simvx.core.descriptors.Property]
__repr__()