neowarsaw/addons/script-ide/tabbar/custom_tab.gd
2026-01-04 08:43:50 +01:00

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())