Source code for simvx.editor.panels.inspector_sections._audio_section
"""AudioStreamSection -- audio file picker.
Registered with the section registry via @register_inspector_section at
import time.
"""
from simvx.core import (
AudioStream,
AudioStreamPlayer,
AudioStreamPlayer2D,
AudioStreamPlayer3D,
Control,
)
from ._base import (
InspectorSection,
_make_property_row,
_make_resource_picker,
register_inspector_section,
)
[docs]
@register_inspector_section
class AudioStreamSection(InspectorSection):
section_title = "Audio"
priority = 20
[docs]
def can_handle(self, node):
return isinstance(node, AudioStreamPlayer | AudioStreamPlayer2D | AudioStreamPlayer3D)
[docs]
def build_rows(self, node, ctx):
rows: list[Control] = []
current_path = node.stream.path if node.stream else None
picker = _make_resource_picker(current_path=current_path, file_filter="*.ogg;*.wav;*.mp3;*.flac")
picker.file_selected.connect(lambda path, c=ctx, n=node: _set_audio_stream(n, path, c))
picker.cleared.connect(lambda c=ctx, n=node: _set_audio_stream(n, None, c))
rows.append(_make_property_row("Stream", picker))
ctx.register_widget("audio_stream", picker)
return rows
def _set_audio_stream(node, path, ctx):
old_stream = node.stream
new_stream = AudioStream(path) if path else None
def do_fn():
node.stream = new_stream
def undo_fn():
node.stream = old_stream
ctx.on_callable_command(do_fn, undo_fn, description=f"Set {node.name} audio stream")
ctx.property_changed_signal.emit(node, "stream", old_stream, new_stream)