async def show_source_properties_dialog(conn, delay): ss = SourcesService(conn) sources = await ss.get_sources() first_source = sources[0] first_source_id = first_source.source_id print("Please cancel the 'properties' dialogue for:") # TODO: When str_source_multiline is available, print it here. await ss.show_source_properties(first_source_id)
async def manipulate_selected(conn) -> None: sts = SelectionService(conn) sos = SourcesService(conn) ss = ScenesService(conn) path = Path(__file__).parent / "testpattern.jpg" async with TestScene(conn) as scene: await ss.make_scene_active(scene.source_id) new_source = await sos.create_source( "test pattern 2", "image_source", {"file": str(path)}, options=None ) first = await scene.add_source(source_id=new_source.source_id, options=None) await sts.select_all() print( "Bounding rectangle of original test pattern", await sts.get_bounding_rect() ) # Centre it. await sts.center_on_screen() # Flip it await sts.flip_x() await sts.flip_y() # Enlarge it await sts.fit_to_screen() # Scale it - no origin # Send right code, but doesn't display for unclear reasons. # Tried treating as factor and as final size. await sts.scale(IVec2(5, 5)) await sts.scale(IVec2(1, 1), IVec2(2, 2)) await sts.scale_with_offset(IVec2(10, 10), IVec2(2, 2)) # Enlarge it await sts.stretch_to_screen() await sts.reset_transform() await sts.rotate(45) await sts.set_transform(dict(rotation=12)) await sts.set_visibility(False) await sts.set_visibility(True) await sts.set_stream_visible(False) await sts.set_stream_visible(True) await sts.set_recording_visible(False) await sts.set_settings(dict(locked=True)) await sts.set_settings(dict(locked=False, recordingVisible=True))
async def modify_scene_nodes(conn): ss = SourcesService(conn) source = await ss.create_source( name="Exercise Browser Source", type_="browser_source", settings={"url": "http://twitter.com/PuzzlingOldMan"}, options=ISourceAddOptions(channel=None, is_temporary=False), ) print("Added source", source) async with TestScene(conn) as ts: print("Scene added.") await ts.make_active() print("Scene made active (via scene).") folder = await ts.create_folder("test_folder") print("Added folder") scene_node = await ts.add_source(source.source_id) print("Created scene_node from source") # Add node to folder. await folder.add(scene_node.scene_item_id) # Can't figure out how to create a subfolder! # subfolder = await ts.create_folder("sub_folder") # # Make node for source. # print("Before: Subfolder's parent: ", await subfolder.get_parent()) # await subfolder.set_parent(folder.resource_id) # print("Added subfolder to folder") # print("After: Subfolder's parent: ", await subfolder.get_parent()) print("Name before:", folder.name) await folder.set_name("Test folder renamed") print("Name after:", folder.name) # This exercises get_folders and get_items print(await pp.str_scene_multiline(ts, indent="", as_tree=True, folders_first=True)) print("Before scaling", scene_node.transform) await scene_node.set_scale(IVec2(1.5, 2.0)) print("After scaling - proxy value", scene_node.name, scene_node.transform) items = await folder.get_items() assert len(items) == 1 refetched_scene_node = items[0] print( "After scaling - refetched value", refetched_scene_node.name, refetched_scene_node.transform, ) # Why does the position change? Checked the data being transmitted and it # appears to be a bug in StreamLabs. print( "Before setting", scene_node.locked, scene_node.visible, scene_node.stream_visible, ) await scene_node.set_settings( dict(locked=True, visible=False, stream_visible=False)) print( "After setting - proxy value", scene_node.locked, scene_node.visible, scene_node.stream_visible, ) items = await folder.get_items() assert len(items) == 1 refetched_scene_node = items[0] print( "After setting - refetched value", refetched_scene_node.locked, refetched_scene_node.visible, refetched_scene_node.stream_visible, ) await asyncio.sleep(2) print("Scene deleted, old scene made active (via sceneservice)")
async def direct_selection(conn) -> None: sts = SelectionService(conn) sos = SourcesService(conn) ss = ScenesService(conn) path = Path(__file__).parent / "testpattern.jpg" async with TestScene(conn) as scene: await ss.make_scene_active(scene.source_id) new_source = await sos.create_source( "test pattern", "image_source", {"file": str(path)}, options=None ) first = await scene.add_source(source_id=new_source.source_id, options=None) await scene.add_source(source_id=new_source.source_id, options=None) middle = await scene.add_source(source_id=new_source.source_id, options=None) await scene.add_source(source_id=new_source.source_id, options=None) last = await scene.add_source(source_id=new_source.source_id, options=None) # We have 5 entries for test patterns. The last added is selected. selected_ids = await sts.get_ids() assert len(selected_ids) == 1 assert first.id_ not in selected_ids assert middle.id_ not in selected_ids assert last.id_ in selected_ids # Select them all await sts.select_all() selected_ids = await sts.get_ids() assert len(selected_ids) == 5 assert first.id_ in selected_ids assert middle.id_ in selected_ids assert last.id_ in selected_ids # Count them assert (await sts.get_size()) == 5 # Deselect two. await sts.deselect([first.id_, last.id_]) selected_ids = await sts.get_ids() assert first.id_ not in selected_ids assert middle.id_ in selected_ids assert last.id_ not in selected_ids # Repeat the check using is_selected. assert await sts.is_selected(middle.id_) assert not await sts.is_selected(last.id_) # Invert the selection. await sts.invert() selected_ids = await sts.get_ids() assert first.id_ in selected_ids assert middle.id_ not in selected_ids assert last.id_ in selected_ids # Select one more. await sts.add([middle.id_]) selected_ids = await sts.get_ids() assert first.id_ in selected_ids assert middle.id_ in selected_ids assert last.id_ in selected_ids # Inspect via get_model model = await sts.get_model() assert model.last_selected_id == middle.id_ assert set(model.selected_ids) == set([first.id_, middle.id_, last.id_]) # Select only one await sts.select([middle.id_]) selected_ids = await sts.get_ids() assert first.id_ not in selected_ids assert middle.id_ in selected_ids assert last.id_ not in selected_ids scene_items = await sts.get_items() assert len(scene_items) == 1 assert scene_items[0].id_ == middle.id_ await sts.reset() scene_items = await sts.get_items() assert not scene_items
async def modify_scene_nodes(conn): ss = SourcesService(conn) source = await ss.create_source( name="Exercise Browser Source", type_="browser_source", settings={"url": "http://twitter.com/PuzzlingOldMan"}, options=ISourceAddOptions(channel=None, is_temporary=False), ) print("Added source", source) path = Path(__file__).parent / "testpattern.jpg" source = await ss.create_source("test pattern", "image_source", {"file": str(path)}, options=None) async with TestScene(conn) as ts: print("Scene added.") await ts.make_active() print("Scene made active (via scene).") folder = await ts.create_folder("test_folder") print("Added folder") scene_node = await ts.add_source(source.source_id) print("Created scene_node from source. Here is the default transform:") print(scene_node.transform) # Make sure that the position is an integer (see Issue #7 in GitHub) assert scene_node.transform.position.x == 0 # Add node to folder. await folder.add(scene_node.scene_item_id) # Can't figure out how to create a subfolder! # subfolder = await ts.create_folder("sub_folder") # # Make node for source. # print("Before: Subfolder's parent: ", await subfolder.get_parent()) # await subfolder.set_parent(folder.resource_id) # print("Added subfolder to folder") # print("After: Subfolder's parent: ", await subfolder.get_parent()) print("Name before:", folder.name) await folder.set_name("Test folder renamed") print("Name after:", folder.name) # This exercises get_folders and get_items print(await pp.str_scene_multiline(ts, indent="", as_tree=True, folders_first=True)) # Exercise scaling print("Before scaling", scene_node.transform) await scene_node.set_scale(IVec2(0.5, 0.8)) print("After scaling - proxy value", scene_node.name, scene_node.transform) items = await folder.get_items() assert len(items) == 1 refetched_scene_node = items[0] print( "After scaling - refetched value", refetched_scene_node.name, refetched_scene_node.transform, ) # Why does the position change? Checked the data being transmitted and it # appears to be a bug in StreamLabs. print("Wait a moment for the pattern to appear.") await asyncio.sleep(5) print( "Before setting", scene_node.locked, scene_node.visible, scene_node.stream_visible, ) print("Pattern should now disappear from the screen.") await scene_node.set_settings( dict(locked=True, visible=False, stream_visible=False)) print( "After setting - proxy value", scene_node.locked, scene_node.visible, scene_node.stream_visible, ) await asyncio.sleep(15) print("Pattern should now reappear on screen (not in stream though).") assert scene_node.visible == False await scene_node.set_visibility(visible=True) assert scene_node.visible == True await asyncio.sleep(5) items = await folder.get_items() assert len(items) == 1 refetched_scene_node = items[0] print( "After setting - refetched value", refetched_scene_node.locked, refetched_scene_node.visible, refetched_scene_node.stream_visible, ) await asyncio.sleep(2) print("Scene deleted, old scene made active (via sceneservice)")
async def show_add_showcase_dialog(conn, delay): ss = SourcesService(conn) print("Please note the 'Select source type' dialogue.") await ss.show_showcase() await asyncio.sleep(delay)
async def show_add_source_dialog(conn, delay): ss = SourcesService(conn) print("Please note the 'Name source' dialogue.") await ss.show_add_source("This doesn't matter?") await asyncio.sleep(delay)
async def show_all_sources(conn): ss = SourcesService(conn) sources = await ss.get_sources() print("All Sources") for source in sources: print(await pp.str_source_multiline(source, ""))
async def add_source(conn): ss = SourcesService(conn) events = {} async def callback(key, value): events[key] = events.get(key, 0) + 1 await ss.source_added.subscribe(callback) await ss.source_removed.subscribe(callback) await ss.source_updated.subscribe(callback) source = await ss.create_source( name="Exercise Browser Source", type_="browser_source", settings={"url": "http://twitter.com/PuzzlingOldMan"}, # Tested with is_temporary = True, and it wasn't found in search, # which presumably is correct. options=ISourceAddOptions(channel=None, is_temporary=False), ) print("Created browser source:") print(await pp.str_source_multiline(source, "")) await asyncio.sleep(0.1) assert events == {"SourcesService.sourceAdded": 1} # Refetch the same source by name for source_3 in await ss.get_sources_by_name(source.name): assert source_3.name == source.name if source_3.source_id == source.source_id: break else: assert False, "Search by name failed" await source.set_name("Exercise Browser Source 2") await asyncio.sleep(0.1) assert events == { "SourcesService.sourceAdded": 1, "SourcesService.sourceUpdated": 1, } # Refetch the same source by id source_2 = await ss.get_source(source.id) assert source_2.name == "Exercise Browser Source 2" await ss.remove_source(source.source_id) assert events == { "SourcesService.sourceAdded": 1, "SourcesService.sourceUpdated": 1, "SourcesService.sourceRemoved": 1, } file_source = await ss.add_file( Path(__file__).parent / "testpattern.jpg") print("Created source from file:") print(await pp.str_source_multiline(file_source, "")) await ss.remove_source(file_source.source_id) assert events == { "SourcesService.sourceAdded": 2, "SourcesService.sourceUpdated": 1, "SourcesService.sourceRemoved": 2, }
async def show_all_source_types(conn): ss = SourcesService(conn) print("All Source Types") for item in await ss.get_available_sources_types_list(): print(f"+- {item.value:23s}: {item.description}")