Files
SurfaceSide-UI/scripts/layout_preview.gd
T

57 lines
2.3 KiB
GDScript

extends Control
@export_enum("Landscape", "Dual portrait") var configuration := 0
@export var use_portrait_monitors := true
func _ready() -> void:
if configuration == 1:
$Overview.overview_changed.connect($RightWindow/RightOverview.set_overview)
$RightWindow/RightOverview.overview_changed.connect($Overview.set_overview)
$RightWindow.close_requested.connect(get_tree().quit)
if get_parent() == get_tree().root:
_configure_windows.call_deferred()
func _configure_windows() -> void:
var window := get_window()
var reference := Vector2i(1920, 1080) if configuration == 0 else Vector2i(1080, 1920)
_prepare_window(window, reference)
if configuration == 0:
var usable := DisplayServer.screen_get_usable_rect()
window.size = _preview_size(reference, usable.size, 1)
window.title = "Layout / landscape"
return
var right: Window = $RightWindow
_prepare_window(right, reference)
window.title = "ROV / left portrait"
var portrait_screens: Array[int] = []
for screen in range(DisplayServer.get_screen_count()):
var dimensions := DisplayServer.screen_get_size(screen)
if dimensions.y > dimensions.x:
portrait_screens.append(screen)
if use_portrait_monitors and portrait_screens.size() >= 2:
window.current_screen = portrait_screens[0]
window.mode = Window.MODE_MAXIMIZED
right.current_screen = portrait_screens[1]
right.show()
right.mode = Window.MODE_MAXIMIZED
else:
var usable := DisplayServer.screen_get_usable_rect()
var preview := _preview_size(reference, usable.size, 2)
window.size = preview
right.size = preview
var origin := usable.position + (usable.size - Vector2i(preview.x * 2 + 16, preview.y)) / 2
window.position = origin
right.position = origin + Vector2i(preview.x + 16, 0)
right.show()
func _prepare_window(window: Window, reference: Vector2i) -> void:
window.content_scale_factor = 1.0
window.content_scale_size = reference
window.content_scale_mode = Window.CONTENT_SCALE_MODE_CANVAS_ITEMS
window.content_scale_aspect = Window.CONTENT_SCALE_ASPECT_KEEP
window.mode = Window.MODE_WINDOWED
func _preview_size(reference: Vector2i, usable: Vector2i, count: int) -> Vector2i:
var factor := minf(float(usable.x) * 0.85 / (reference.x * count + 16 * (count - 1)), float(usable.y) * 0.85 / reference.y)
return Vector2i(Vector2(reference) * clampf(factor, 0.1, 1.0))