simvx.core.ui.multiline

MultiLineTextEdit – Multi-line text editor widget with selection, scrollbar, line numbers, cursor blink, undo/redo, and clipboard.

Supports keyboard navigation, mouse click positioning, text selection via shift+arrow keys, vertical scrolling via mouse wheel and scrollbar thumb drag, undo/redo history, clipboard cut/copy/paste, line comments, and select-word (ctrl+d).

Module Contents

Classes

MultiLineTextEdit

Multi-line text editor with selection, scrolling, and line numbers.

Data

API

simvx.core.ui.multiline.__all__

[‘MultiLineTextEdit’]

class simvx.core.ui.multiline.MultiLineTextEdit(text: str = '', **kwargs)

Bases: simvx.core.ui.core.Control

Multi-line text editor with selection, scrolling, and line numbers.

Features: - Multi-line text buffer with cursor navigation - Text selection via shift+arrow keys - Vertical scrollbar with thumb drag and mouse wheel - Optional line number gutter - Cursor blink animation - Read-only mode

Example: editor = MultiLineTextEdit() editor.text = “Hello\nWorld” editor.text_changed.connect(lambda t: print(“Changed:”, t)) editor.show_line_numbers = True

Initialization

text_color

‘ThemeColour(…)’

bg_color

‘ThemeColour(…)’

border_color

‘ThemeColour(…)’

focus_color

‘ThemeColour(…)’

selection_color

‘ThemeColour(…)’

line_number_color

‘ThemeColour(…)’

current_line_color

‘ThemeColour(…)’

gutter_bg_color

‘ThemeColour(…)’

font_size

‘Property(…)’

show_line_numbers

‘Property(…)’

read_only

‘Property(…)’

tab_size

‘Property(…)’

property text: str

Get full text content (lines joined with newlines).

undo()

Restore the previous text state from the undo stack.

redo()

Re-apply the last undone change from the redo stack.

copy()

Copy selected text to clipboard.

cut()

Cut selected text to clipboard.

paste()

Paste clipboard text at cursor, replacing selection if any.

select_all()

Select the entire text buffer.

toggle_comment()

Toggle Python # comment on current line or selected lines.

Preserves indentation: comments are inserted at the minimum indentation level of the affected non-blank lines (VS Code-style).

delete_line()

Delete the current line (or all selected lines).

duplicate_line()

Duplicate the current line or all selected lines below.

move_line_up()

Move the current line (or selected lines) up one position.

move_line_down()

Move the current line (or selected lines) down one position.

select_word()

Select the word at cursor, or the next occurrence of the current selection.

process(dt: float)

Update cursor blink timer.

draw(renderer)
size_x

‘Property(…)’

size_y

‘Property(…)’

property size: simvx.core.math.types.Vec2
get_theme() simvx.core.ui.core.Theme
get_rect() tuple[float, float, float, float]
get_global_rect() tuple[float, float, float, float]
is_point_inside(point) bool
set_anchor_preset(preset: simvx.core.ui.core.AnchorPreset)
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)
draw_popup(renderer)
is_popup_point_inside(point) bool
popup_input(event)
dismiss_popup()
z_index

‘Property(…)’

z_as_relative

‘Property(…)’

property absolute_z_index: int
property position: simvx.core.math.types.Vec2
property rotation: float
property rotation_degrees: float
property scale: simvx.core.math.types.Vec2
property global_position: simvx.core.math.types.Vec2
property global_rotation: float
property global_scale: simvx.core.math.types.Vec2
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, color=None)
wrap_screen(margin: float = 20)
script_error_raised

‘Signal(…)’

classmethod __init_subclass__(**kwargs)
property name: str
property process_mode: simvx.core.descriptors.ProcessMode
reset_error() None
add_child(node: simvx.core.node.Node) simvx.core.node.Node
remove_child(node: simvx.core.node.Node)
reparent(new_parent: simvx.core.node.Node)
get_node(path: str) simvx.core.node.Node
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None
find(node_type: type) simvx.core.node.Node | None
find_all(node_type: type, recursive: bool = True) list
property path: str
add_to_group(group: str)
remove_from_group(group: str)
is_in_group(group: str) bool
ready() None
enter_tree() None
exit_tree() None
physics_process(dt: float) None
input_event(event: simvx.core.events.InputEvent) None
input(event: simvx.core.events.TreeInputEvent) None
unhandled_input(event: simvx.core.events.TreeInputEvent) None
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle
stop_coroutine(gen_or_handle)
destroy()
queue_free

None

property tree: simvx.core.scene_tree.SceneTree
get_tree() simvx.core.scene_tree.SceneTree
__getitem__(key: str)
classmethod get_properties() dict[str, simvx.core.descriptors.Property]
get_settings

None

__repr__()