diff --git a/classes/deck/nodes/obs_scene_list.gd b/classes/deck/nodes/obs_scene_list.gd new file mode 100644 index 0000000..222cec9 --- /dev/null +++ b/classes/deck/nodes/obs_scene_list.gd @@ -0,0 +1,49 @@ +extends DeckNode + +var noobs: NoOBSWS + +func _init() -> void: + name = "Scene Selector" + node_type = "obs_scene_list" + description = "" + category = "obs" + + props_to_serialize = [] + + add_output_port( + DeckType.Types.STRING, + "Select a scene", + "singlechoice" + ) + + add_virtual_port( + DeckType.Types.BOOL, + "Refresh", + "button" + ) + + +func _receive(on_virtual_port: int, data: Variant, extra_data: Array = []) -> void: + if on_virtual_port != 0: + return + + if noobs == null: + noobs = Connections.obs_websocket + + var items: Array + var req := noobs.make_generic_request("GetSceneList") + await req.response_received + items = req.message.response_data.scenes + var new_desc := "singlechoice" + for scene in items: + new_desc += ":" + scene.sceneName + new_desc.trim_suffix(":") + get_output_ports()[0].descriptor = new_desc + ports_updated.emit() + + +func _value_request(on_input_port: int) -> Variant: + if ports[0].value != null: + return ports[0].value + + return null diff --git a/classes/deck/port.gd b/classes/deck/port.gd index 9cea9de..e1c1816 100644 --- a/classes/deck/port.gd +++ b/classes/deck/port.gd @@ -48,4 +48,8 @@ func _init( func set_value(v: Variant) -> void: + if v is Callable: + value = v.call() + return + value = v