@tool extends LineEdit signal changed() const Utils = preload("../utils.gd") func _ready(): editable = false context_menu_enabled = false virtual_keyboard_enabled = false shortcut_keys_enabled = false selecting_enabled = false drag_and_drop_selection_enabled = false middle_mouse_paste_enabled = false ## The underlying resource. This is opened for editing when the user clicks on the control. Its also ## used when dragging from the control. var _value:Resource = null: set(value): if _value == value: return # stop tracking changes to the old resource (if any) if is_instance_valid(_value): _value.changed.disconnect(_update_from_value) _value = value # track changes to the resource itself if is_instance_valid(_value): _value.changed.connect(_update_from_value) _update_from_value() changed.emit() func _update_from_value(): if not is_instance_valid(_value): text = "" tooltip_text = "" remove_theme_color_override("font_uneditable_color") else: text = _value._editor_name() tooltip_text = _value.resource_path # if the value is shared, we override the font color to indicate that if not Utils.is_inline(_value): add_theme_color_override("font_uneditable_color", get_theme_color("accent_color", "Editor")) queue_redraw() else: remove_theme_color_override("font_uneditable_color") ## Can be overridden to handle the drop data. This method is called when the user drops something on the control. ## If the value should be updated ,this method should set the _value property. func _do_drop_data(data:Resource): _value = data ## Whether this control can accept drop data. This method is called when the user drags something over the control. func _accepts_drop_data(data:Resource) -> bool: return false func _can_drop_data(at_position, data) -> bool: if data is Resource: return _accepts_drop_data(data) if not data is Dictionary: return false if data.has("files"): for file in data["files"]: if _accepts_drop_data(ResourceLoader.load(file)): return true return false func _drop_data(at_position, data) -> void: if data is Resource: _do_drop_data(data) return for file in data["files"]: var item := ResourceLoader.load(file) _do_drop_data(item) func _get_drag_data(at_position: Vector2) -> Variant: if is_instance_valid(_value): var _preview := TextureRect.new() _preview.texture = get_theme_icon("File", "EditorIcons") set_drag_preview(_preview) # if the value is shared, we just hand out the resource path if not Utils.is_inline(_value): return {"files": [_value.resource_path]} else: # otherwise we hand out a shallow copy return _value.duplicate() else: return null func _gui_input(event): if event is InputEventMouseButton: if event.pressed and event.button_index == MOUSE_BUTTON_LEFT: if is_instance_valid(_value): EditorInterface.edit_resource(_value)