gd: added input addon
This commit is contained in:
148
addons/guide/editor/binding_dialog/binding_dialog.gd
Normal file
148
addons/guide/editor/binding_dialog/binding_dialog.gd
Normal file
@ -0,0 +1,148 @@
|
||||
@tool
|
||||
extends Window
|
||||
|
||||
const ClassScanner = preload("../class_scanner.gd")
|
||||
const Utils = preload("../utils.gd")
|
||||
|
||||
signal input_selected(input:GUIDEInput)
|
||||
|
||||
@onready var _input_display = %InputDisplay
|
||||
@onready var _available_types:Container = %AvailableTypes
|
||||
@onready var _none_available:Control = %NoneAvailable
|
||||
@onready var _some_available:Control = %SomeAvailable
|
||||
@onready var _select_bool_button:Button = %SelectBoolButton
|
||||
@onready var _select_1d_button:Button = %Select1DButton
|
||||
@onready var _select_2d_button:Button = %Select2DButton
|
||||
@onready var _select_3d_button:Button = %Select3DButton
|
||||
@onready var _instructions_label:Label = %InstructionsLabel
|
||||
@onready var _accept_detection_button:Button = %AcceptDetectionButton
|
||||
@onready var _input_detector:GUIDEInputDetector = %InputDetector
|
||||
@onready var _detect_bool_button:Button = %DetectBoolButton
|
||||
@onready var _detect_1d_button:Button = %Detect1DButton
|
||||
@onready var _detect_2d_button:Button = %Detect2DButton
|
||||
@onready var _detect_3d_button:Button = %Detect3DButton
|
||||
|
||||
var _scanner:ClassScanner
|
||||
var _last_detected_input:GUIDEInput
|
||||
|
||||
|
||||
func initialize(scanner:ClassScanner):
|
||||
_scanner = scanner
|
||||
_setup_dialog()
|
||||
|
||||
func _setup_dialog():
|
||||
# we need to bind this here. if we bind it in the editor, the editor
|
||||
# will crash when opening the scene because it will delete the node it
|
||||
# just tries to edit.
|
||||
focus_exited.connect(_on_close_requested)
|
||||
|
||||
_show_inputs_of_value_type(GUIDEAction.GUIDEActionValueType.BOOL)
|
||||
_instructions_label.text = tr("Press one of the buttons above to detect an input.")
|
||||
_accept_detection_button.visible = false
|
||||
|
||||
|
||||
func _on_close_requested():
|
||||
hide()
|
||||
queue_free()
|
||||
|
||||
|
||||
func _show_inputs_of_value_type(type:GUIDEAction.GUIDEActionValueType) -> void:
|
||||
var items:Array[GUIDEInput] = []
|
||||
|
||||
_select_bool_button.set_pressed_no_signal(type == GUIDEAction.GUIDEActionValueType.BOOL)
|
||||
_select_1d_button.set_pressed_no_signal(type == GUIDEAction.GUIDEActionValueType.AXIS_1D)
|
||||
_select_2d_button.set_pressed_no_signal(type == GUIDEAction.GUIDEActionValueType.AXIS_2D)
|
||||
_select_3d_button.set_pressed_no_signal(type == GUIDEAction.GUIDEActionValueType.AXIS_3D)
|
||||
|
||||
var all_inputs = _scanner.find_inheritors("GUIDEInput")
|
||||
for script in all_inputs.values():
|
||||
var dummy:GUIDEInput = script.new()
|
||||
if dummy._native_value_type() == type:
|
||||
items.append(dummy)
|
||||
|
||||
_some_available.visible = not items.is_empty()
|
||||
_none_available.visible = items.is_empty()
|
||||
|
||||
if items.is_empty():
|
||||
return
|
||||
|
||||
items.sort_custom(func(a,b): return a._editor_name().nocasecmp_to(b._editor_name()) < 0)
|
||||
Utils.clear(_available_types)
|
||||
|
||||
for item in items:
|
||||
var button = Button.new()
|
||||
button.text = item._editor_name()
|
||||
button.tooltip_text = item._editor_description()
|
||||
button.pressed.connect(_deliver.bind(item))
|
||||
button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
|
||||
_available_types.add_child(button)
|
||||
|
||||
|
||||
func _deliver(input:GUIDEInput):
|
||||
input_selected.emit(input)
|
||||
hide()
|
||||
queue_free()
|
||||
|
||||
|
||||
func _on_select_bool_button_pressed():
|
||||
_show_inputs_of_value_type(GUIDEAction.GUIDEActionValueType.BOOL)
|
||||
|
||||
|
||||
func _on_select_1d_button_pressed():
|
||||
_show_inputs_of_value_type(GUIDEAction.GUIDEActionValueType.AXIS_1D)
|
||||
|
||||
|
||||
func _on_select_2d_button_pressed():
|
||||
_show_inputs_of_value_type(GUIDEAction.GUIDEActionValueType.AXIS_2D)
|
||||
|
||||
|
||||
func _on_select_3d_button_pressed():
|
||||
_show_inputs_of_value_type(GUIDEAction.GUIDEActionValueType.AXIS_3D)
|
||||
|
||||
|
||||
func _on_input_detector_detection_started():
|
||||
_instructions_label.text = tr("Actuate the input now...")
|
||||
|
||||
|
||||
func _on_input_detector_input_detected(input:GUIDEInput):
|
||||
_instructions_label.visible = false
|
||||
_input_display.visible = true
|
||||
_input_display.input = input
|
||||
_accept_detection_button.visible = true
|
||||
_last_detected_input = input
|
||||
|
||||
|
||||
func _begin_detect_input(type:GUIDEAction.GUIDEActionValueType):
|
||||
_last_detected_input = null
|
||||
_instructions_label.visible = true
|
||||
_instructions_label.text = tr("Get ready...")
|
||||
_accept_detection_button.visible = false
|
||||
_input_display.visible = false
|
||||
_input_detector.detect(type)
|
||||
|
||||
|
||||
func _on_detect_bool_button_pressed():
|
||||
_detect_bool_button.release_focus()
|
||||
_begin_detect_input(GUIDEAction.GUIDEActionValueType.BOOL)
|
||||
|
||||
|
||||
func _on_detect_1d_button_pressed():
|
||||
_detect_1d_button.release_focus()
|
||||
_begin_detect_input(GUIDEAction.GUIDEActionValueType.AXIS_1D)
|
||||
|
||||
|
||||
func _on_detect_2d_button_pressed():
|
||||
_detect_2d_button.release_focus()
|
||||
_begin_detect_input(GUIDEAction.GUIDEActionValueType.AXIS_2D)
|
||||
|
||||
|
||||
func _on_detect_3d_button_pressed():
|
||||
_detect_3d_button.release_focus()
|
||||
_begin_detect_input(GUIDEAction.GUIDEActionValueType.AXIS_3D)
|
||||
|
||||
|
||||
func _on_accept_detection_button_pressed():
|
||||
input_selected.emit(_last_detected_input)
|
||||
hide()
|
||||
queue_free
|
1
addons/guide/editor/binding_dialog/binding_dialog.gd.uid
Normal file
1
addons/guide/editor/binding_dialog/binding_dialog.gd.uid
Normal file
@ -0,0 +1 @@
|
||||
uid://dfuj0dl8ob6r6
|
216
addons/guide/editor/binding_dialog/binding_dialog.tscn
Normal file
216
addons/guide/editor/binding_dialog/binding_dialog.tscn
Normal file
@ -0,0 +1,216 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://dic27bm4pfw3q"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/guide/editor/binding_dialog/binding_dialog.gd" id="1_tknjd"]
|
||||
[ext_resource type="PackedScene" uid="uid://dsv7s6tfmnsrs" path="res://addons/guide/editor/input_display/input_display.tscn" id="2_83ieu"]
|
||||
[ext_resource type="Script" path="res://addons/guide/remapping/guide_input_detector.gd" id="3_c6q6r"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3e874"]
|
||||
content_margin_left = 4.0
|
||||
content_margin_top = 4.0
|
||||
content_margin_right = 4.0
|
||||
content_margin_bottom = 4.0
|
||||
bg_color = Color(1, 0.365, 0.365, 1)
|
||||
draw_center = false
|
||||
border_width_left = 2
|
||||
border_width_top = 2
|
||||
border_width_right = 2
|
||||
border_width_bottom = 2
|
||||
corner_detail = 1
|
||||
|
||||
[node name="BindingDialog" type="Window"]
|
||||
title = "Input Configuration"
|
||||
initial_position = 4
|
||||
size = Vector2i(1200, 600)
|
||||
popup_window = true
|
||||
min_size = Vector2i(1200, 600)
|
||||
script = ExtResource("1_tknjd")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="."]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme_override_constants/margin_bottom = 5
|
||||
|
||||
[node name="BGPanel" type="Panel" parent="MarginContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_3e874")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="MarginContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 5
|
||||
theme_override_constants/margin_top = 5
|
||||
theme_override_constants/margin_right = 5
|
||||
theme_override_constants/margin_bottom = 5
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/MarginContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/MarginContainer/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="LeftPanel" type="Panel" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 5
|
||||
theme_override_constants/margin_top = 5
|
||||
theme_override_constants/margin_right = 5
|
||||
theme_override_constants/margin_bottom = 5
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_constants/separation = 10
|
||||
|
||||
[node name="Label" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Detect Input"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="DetectBoolButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "Boolean"
|
||||
|
||||
[node name="Detect1DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "1D"
|
||||
|
||||
[node name="Detect2DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "2D"
|
||||
|
||||
[node name="Detect3DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(80, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "3D"
|
||||
|
||||
[node name="InstructionsLabel" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 6
|
||||
text = "3..2..1.."
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
autowrap_mode = 2
|
||||
|
||||
[node name="InputDisplay" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer" instance=ExtResource("2_83ieu")]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 6
|
||||
|
||||
[node name="AcceptDetectionButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
text = "Accept"
|
||||
|
||||
[node name="MarginContainer2" type="MarginContainer" parent="MarginContainer/MarginContainer/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="RightPanel" type="Panel" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 5
|
||||
theme_override_constants/margin_top = 5
|
||||
theme_override_constants/margin_right = 5
|
||||
theme_override_constants/margin_bottom = 5
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_constants/separation = 10
|
||||
|
||||
[node name="Label" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Select Input"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="SelectBoolButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(80, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
toggle_mode = true
|
||||
text = "Boolean"
|
||||
|
||||
[node name="Select1DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(80, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
toggle_mode = true
|
||||
text = "1D"
|
||||
|
||||
[node name="Select2DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(80, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
toggle_mode = true
|
||||
text = "2D"
|
||||
|
||||
[node name="Select3DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(80, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
toggle_mode = true
|
||||
text = "3D"
|
||||
|
||||
[node name="NoneAvailable" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 6
|
||||
size_flags_vertical = 6
|
||||
text = "No matching inputs available."
|
||||
|
||||
[node name="SomeAvailable" type="ScrollContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="AvailableTypes" type="VBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/SomeAvailable"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="InputDetector" type="Node" parent="."]
|
||||
unique_name_in_owner = true
|
||||
script = ExtResource("3_c6q6r")
|
||||
|
||||
[connection signal="close_requested" from="." to="." method="_on_close_requested"]
|
||||
[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/DetectBoolButton" to="." method="_on_detect_bool_button_pressed"]
|
||||
[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/Detect1DButton" to="." method="_on_detect_1d_button_pressed"]
|
||||
[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/Detect2DButton" to="." method="_on_detect_2d_button_pressed"]
|
||||
[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/Detect3DButton" to="." method="_on_detect_3d_button_pressed"]
|
||||
[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/AcceptDetectionButton" to="." method="_on_accept_detection_button_pressed"]
|
||||
[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer/SelectBoolButton" to="." method="_on_select_bool_button_pressed"]
|
||||
[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer/Select1DButton" to="." method="_on_select_1d_button_pressed"]
|
||||
[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer/Select2DButton" to="." method="_on_select_2d_button_pressed"]
|
||||
[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer/Select3DButton" to="." method="_on_select_3d_button_pressed"]
|
||||
[connection signal="detection_started" from="InputDetector" to="." method="_on_input_detector_detection_started"]
|
||||
[connection signal="input_detected" from="InputDetector" to="." method="_on_input_detector_input_detected"]
|
Reference in New Issue
Block a user