57 lines
2.3 KiB
GDScript
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))
|