Files
MusicPlayer/tools/take_screenshots.gd
T

54 lines
2.0 KiB
GDScript

extends SceneTree
## Takes a screenshot of the main window in every UiTour state, against a fake server.
##
## Usage:
## godot --path . -s tools/take_screenshots.gd -- <output dir>
##
## Writes [code]<state>.png[/code] for each state and [code]layout.json[/code] with where
## every node is in each state. With [code]--headless[/code] only the layout is written.
## Compare two runs with [code]tools/compare_screenshots.py[/code].
const SIZE: Vector2i = Vector2i(1920, 1080)
func _initialize() -> void:
_take.call_deferred()
func _take() -> void:
var args: PackedStringArray = OS.get_cmdline_user_args()
var out_dir: String = args[0] if !args.is_empty() else "user://screenshots"
DirAccess.make_dir_recursive_absolute(out_dir)
var draws: bool = DisplayServer.get_name() != "headless"
# Loaded here, not named as a class: autoloads such as Playlist do not exist yet
# when this script is compiled
var ui_tour: GDScript = load("res://tests/fakes/ui_tour.gd")
ui_tour.prepare_autoloads()
var server: RefCounted = ui_tour.make_server().install()
# Drawn at the layout size, so the pictures do not depend on the screen size
var viewport: SubViewport = SubViewport.new()
viewport.size = SIZE
viewport.gui_embed_subwindows = true
viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS
root.add_child(viewport)
var main: Control = load("res://MainWindow.tscn").instantiate()
viewport.add_child(main)
var layout: Dictionary = {}
var save_state: Callable = func(state: String, popup: Node) -> void:
layout[state] = ui_tour.dump_layout(main, main if popup == null else popup)
if draws:
await RenderingServer.frame_post_draw
viewport.get_texture().get_image().save_png(out_dir.path_join(state + ".png"))
print("Saved state ", state)
await ui_tour.new(main).run(save_state)
var file: FileAccess = FileAccess.open(out_dir.path_join("layout.json"), FileAccess.WRITE)
file.store_string(JSON.stringify(layout, " ", true))
file.close()
server.uninstall()
main.queue_free()
quit()