85 lines
2.3 KiB
GDScript
85 lines
2.3 KiB
GDScript
@tool
|
|
extends Button
|
|
|
|
signal close_pressed
|
|
signal right_clicked
|
|
signal dragged_over
|
|
signal dropped(source_index: int, target_index: int)
|
|
|
|
var close_button: Button
|
|
|
|
func _ready() -> void:
|
|
icon_alignment = HORIZONTAL_ALIGNMENT_LEFT
|
|
alignment = HORIZONTAL_ALIGNMENT_LEFT
|
|
action_mode = ACTION_MODE_BUTTON_PRESS
|
|
auto_translate_mode = Node.AUTO_TRANSLATE_MODE_DISABLED
|
|
toggle_mode = true
|
|
|
|
func show_close_button():
|
|
if (close_button == null):
|
|
close_button = create_close_button()
|
|
|
|
add_child(close_button)
|
|
close_button.set_anchors_and_offsets_preset(Control.PRESET_CENTER_RIGHT)
|
|
|
|
func hide_close_button():
|
|
if (close_button != null):
|
|
remove_child(close_button)
|
|
|
|
func create_close_button() -> Button:
|
|
close_button = Button.new()
|
|
close_button.icon = EditorInterface.get_editor_theme().get_icon(&"Close", &"EditorIcons")
|
|
close_button.flat = true
|
|
close_button.focus_mode = Control.FOCUS_NONE
|
|
close_button.pressed.connect(on_close_pressed)
|
|
|
|
return close_button
|
|
|
|
func _gui_input(event: InputEvent) -> void:
|
|
if event is InputEventMouseButton && event.pressed:
|
|
if event.button_index == MOUSE_BUTTON_MIDDLE:
|
|
on_close_pressed()
|
|
elif (event.button_index == MOUSE_BUTTON_RIGHT):
|
|
button_pressed = true
|
|
on_right_click()
|
|
|
|
func on_right_click():
|
|
right_clicked.emit()
|
|
|
|
func on_close_pressed() -> void:
|
|
close_pressed.emit()
|
|
|
|
func _get_drag_data(at_position: Vector2) -> Variant:
|
|
var preview: Button = Button.new()
|
|
preview.text = text
|
|
preview.icon = icon
|
|
preview.icon_alignment = HORIZONTAL_ALIGNMENT_LEFT
|
|
preview.alignment = HORIZONTAL_ALIGNMENT_LEFT
|
|
preview.auto_translate_mode = Node.AUTO_TRANSLATE_MODE_DISABLED
|
|
preview.add_theme_stylebox_override(&"normal", get_theme_stylebox(&"normal"))
|
|
|
|
set_drag_preview(preview)
|
|
|
|
var drag_data: Dictionary[String, Variant]
|
|
drag_data["type"] = "script_list_element"
|
|
drag_data["script_list_element"] = EditorInterface.get_script_editor().get_current_editor()
|
|
drag_data["index"] = get_index()
|
|
|
|
return drag_data
|
|
|
|
func _can_drop_data(at_position: Vector2, data: Variant) -> bool:
|
|
if !(data is Dictionary):
|
|
return false
|
|
|
|
var can_drop: bool = data.has("index")
|
|
|
|
if (can_drop):
|
|
dragged_over.emit()
|
|
|
|
return can_drop
|
|
|
|
func _drop_data(at_position: Vector2, data: Variant) -> void:
|
|
if (!_can_drop_data(at_position, data)):
|
|
return
|
|
|
|
dropped.emit(data["index"], get_index())
|