164 lines
5.3 KiB
GDScript
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)
|