Files
uarep-ctl/scenes/работа.gd

164 lines
5.3 KiB
GDScript

extends Panel
@export var col_red: Color
@export var col_grey: Color
@export var strob_min_width: float
@export var strob_max_width: float
@export var strob_min_band: float
@export var strob_max_band: float
@export var drag_scale_width: float
@export var drag_scale_band: float
@export var window_0_id: int
signal add_imit_threat (signal_name: String)
signal del_imit_threat (signal_name: String)
enum DRAG_FSM { IDLE, DRAG, OFF }
""" Состояние перетаскивания """
var drag_pos_begin: Vector2
""" Точка начала перетаскивания """
var drag_fsm: DRAG_FSM = DRAG_FSM.IDLE
""" Текущее состояние перетаскивания """
var drag_button: MouseButton
""" Кнопка мыши нажатая при перетаскивании """
var strob_width_begin: float
""" Ширина строба по углу в момент начала перетаскивания """
var strob_dir_begin: float
""" Направление антенны в момент начала перетаскивания """
var strob_band_begin: float
""" Ширина строба в момент начала перетаскивания """
var strob_center: Vector2
""" Центр антенн """
var shift_pressed: bool
""" Кнопка SHIFT нажата """
signal drag_begin
""" Вызывается в момент начала перетаскивания """
signal drag_continue
""" Вызывается во время продолжения перетаскивания """
signal drag_end
""" Вызывается в момент завершения перетаскивания """
signal full_screen
""" Вызывается при смене режима окна полный экран - оконный """
func _ready():
$btn_strobe.button_connect('pressed', Callable(self, 'on_button_strobe_pressed'))
$btn_off.set_pressed(true)
strob_center = $canvas.get_strob_center()
on_button_strobe_pressed()
drag_fsm = DRAG_FSM.OFF
var nodes: = get_tree().get_nodes_in_group('группа-режим-помехи')
for btn in nodes:
btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes))
func on_button_strobe_pressed():
if $btn_strobe.is_pressed():
$canvas.set_strob_visible(true)
drag_fsm = DRAG_FSM.IDLE
else:
$canvas.set_strob_visible(false)
drag_fsm = DRAG_FSM.OFF
func on_button_pressed(btn_this, btn_others):
# поведение радиокнопок в группе
for btn_other in btn_others:
btn_other.set_pressed(btn_this == btn_other)
func clip_value(val, val_min, val_max):
if val < val_min: val = val_min
if val > val_max: val = val_max
return val
func get_strob_width(pos: Vector2, prev: float) -> float:
var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width
strob_dir_width = clip_value(strob_dir_width, strob_min_width, strob_max_width)
return strob_dir_width
func get_strob_band(pos: Vector2, prev: float) -> float:
var strob_dir_band: float = prev - (drag_pos_begin.y - pos.y) * drag_scale_band
strob_dir_band = clip_value(strob_dir_band, strob_min_band, strob_max_band)
return strob_dir_band
func set_strob(pos: Vector2):
var radp: Vector2 = Tools.map_dec_to_rad(strob_center, pos)
if radp.y < $canvas.get_radius_max():
$canvas.set_strob_dir(radp.x)
$canvas.set_strob_radius(radp.y)
func _on_drag_continue(event):
if drag_button == MOUSE_BUTTON_RIGHT:
if shift_pressed:
var strob_width: float = get_strob_width(event.position, strob_width_begin)
$canvas.set_strob_width(strob_width)
else:
var strob_band: float = get_strob_band(event.position, strob_band_begin)
$canvas.set_strob_band(strob_band)
elif drag_button == MOUSE_BUTTON_LEFT:
set_strob(event.position)
func _on_drag_begin(event):
drag_pos_begin = event.position
if drag_button == MOUSE_BUTTON_LEFT:
set_strob(event.position)
elif drag_button == MOUSE_BUTTON_RIGHT:
strob_width_begin = $canvas.get_strob_width()
strob_band_begin = $canvas.get_strob_band()
func _input(event):
if event is InputEventMouseMotion:
if drag_fsm == DRAG_FSM.DRAG:
emit_signal('drag_continue', event)
elif event is InputEventMouseButton:
drag_button = event.button_index
if event.pressed:
if drag_fsm == DRAG_FSM.IDLE:
drag_fsm = DRAG_FSM.DRAG
emit_signal('drag_begin', event)
else:
drag_fsm = DRAG_FSM.IDLE
emit_signal('drag_end', event)
elif event is InputEventKey:
if event.pressed and event.physical_keycode == KEY_F11:
emit_signal('full_screen')
elif event.physical_keycode == KEY_SHIFT:
shift_pressed = event.pressed
func toggle_full_screen(id: int):
var mode = DisplayServer.window_get_mode(id)
if mode == DisplayServer.WINDOW_MODE_FULLSCREEN:
mode = DisplayServer.WINDOW_MODE_WINDOWED
else:
mode = DisplayServer.WINDOW_MODE_FULLSCREEN
DisplayServer.window_set_mode(mode, id)
func _on_full_screen():
toggle_full_screen(window_1_id)
toggle_full_screen(window_0_id)
func _on_btn_down(signal_name: String) -> void:
emit_signal(signal_name)