extends Control @export var selected_screen : int = -1 : set(value): selected_screen = value queue_redraw() @export_subgroup("Colors", "color_") @export var color_selected : Color = Color.WHITE @export var color_background_selected : Color = Color(1., 1., 1., 0.8) @export var color_not_selected : Color = Color.DARK_GRAY @export var color_background_not_selected : Color = Color(0.2, 0.2, 0.2, 0.8) @export_subgroup("Border", "border_") @export var border_size_selected : float = 2. @export var border_size_not_selected : float = 1. @export_subgroup("Text", "font_") @export var font : Font @export var font_size : int = 16 @export var font_margin : Vector2 = Vector2(2., 2.) @onready var screens : Array[Rect2] = [] func _ready() -> void: queue_redraw() func _get_screen_rect(id : int) -> Rect2: return Rect2(DisplayServer.screen_get_position(id), DisplayServer.screen_get_size(id)) func _draw() -> void: screens.clear() var count : int = DisplayServer.get_screen_count() var screen_size : Rect2 = _get_screen_rect(0) screens.append(screen_size) var screen_accumulation : Rect2 = screen_size for i : int in range(1, count): screen_size = _get_screen_rect(i) screens.append(screen_size) screen_accumulation = screen_accumulation.merge(screen_size) var overall_size : Vector2i = screen_accumulation.size var ratio : Vector2 = size / Vector2(overall_size) var draw_ratio : float = min(ratio.x, ratio.y) var offset : Vector2 = screen_accumulation.position for i : int in range(count): var s : Rect2 = screens[i] s.position -= offset s.position *= draw_ratio s.size *= draw_ratio screens[i] = s for i : int in range(count): if i != selected_screen: var s : Rect2 = screens[i] _draw_screen_hint(s, color_not_selected, color_background_not_selected, border_size_not_selected, i) if selected_screen in range(count): _draw_screen_hint(screens[selected_screen], color_selected, color_background_selected, border_size_selected, selected_screen) func _draw_screen_hint(rect : Rect2, color : Color, background : Color, thickness : float, id : int) -> void: draw_rect(rect, background, true) draw_rect(rect, color, false, thickness, true) if font != null: draw_string(font, rect.position + Vector2(font_margin.x, rect.size.y - font_margin.y), str(id), HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, color) func get_screen(pos : Vector2, select : bool = false) -> int: var selected : int = -1 for i : int in range(screens.size()): var s : Rect2 = screens[i] if s.has_point(pos): selected = i break if select: selected_screen = selected return selected
or share this direct link: