Plugins del inspector

La base del inspector admite complementos personalizados para crear sus propios widgets para editar propiedades. Este tutorial explica cómo usar las clases: ref: class_EditorInspectorPlugin y: ref:` class_EditorProperty` para escribir dichos complementos con el ejemplo de creación de un editor de valores personalizado.

Organización

Al igual que: ref: doc_making_plugins, comenzamos creando un nuevo complemento, obteniendo un archivo``plugin.cfg`` creado y comenzamos con nuestro: ref:` class_EditorPlugin`. Sin embargo, en lugar de usar add_custom_node o add_control_to_dock usaremos add_inspector_plugin.

# MyEditorPlugin.gd
tool
extends EditorPlugin


var plugin


func _enter_tree():
    # EditorInspectorPlugin is a resource, so we use `new()` instead of `instance()`.
    plugin = preload("res://addons/MyPlugin/MyInspectorPlugin.gd").new()
    add_inspector_plugin(plugin)


func _exit_tree():
    remove_inspector_plugin(plugin)

EditorInspectorPlugin

Para realmente conectarnos al Inspector, creamos una clase: ref: class_EditorInspectorPlugin. Este script proporciona los "ganchos" al inspector. Gracias a esta clase, el editor llamará a las funciones dentro del EditorInspectorPlugin mientras pasa por el proceso de construcción de la interfaz de usuario para el inspector. El script se usa para verificar si debemos habilitarnos para cualquier: ref: class_Object que esté actualmente en el inspector (incluyendo cualquier: ref:class_Resource que esté incrustado!).

Una vez habilitado, EditorInspectorPlugin tiene métodos que permiten agregar nodos: ref: class_EditorProperty o simplemente nodos personalizados: ref:` class_Control` al principio y al final del inspector para eso: ref: class_Object, o para anular o cambiar los nodos existentes editores de propiedades.

# MyInspectorPlugin.gd
extends EditorInspectorPlugin


func can_handle(object):
    # Here you can specify which object types (classes) should be handled by
    # this plugin. For example if the plugin is specific to your player
    # class defined with `class_name MyPlayer`, you can do:
    # `return object is MyPlayer`
    # In this example we'll support all objects, so:
    return true


func parse_property(object, type, path, hint, hint_text, usage):
    # We will handle properties of type integer.
    if type == TYPE_INT:
        # Register *an instance* of the custom property editor that we'll define next.
        add_property_editor(path, MyIntEditor.new())
        # We return `true` to notify the inspector that we'll be handling
        # this integer property, so it doesn't need to parse other plugins
        # (including built-in ones) for an appropriate editor.
        return true
    else:
        return false

EditorProperty

A continuación, definimos el editor de valor personalizado actual: ref: class_EditorProperty que queremos instanciar para editar enteros. Este es un custom: ref: class_Control y podemos agregar cualquier tipo de nodos adicionales para hacer widgets avanzados para incrustar en el inspector.

# MyIntEditor.gd
extends EditorProperty
class_name MyIntEditor


var updating = false
var spin = EditorSpinSlider.new()


func _init():
   # We'll add an EditorSpinSlider control, which is the same that the
   # inspector already uses for integer and float edition.
   # If you want to put the editor below the property name, use:
   # `set_bottom_editor(spin)`
   # Otherwise to put it inline with the property name use:
   add_child(spin)
   # To remember focus when selected back:
   add_focusable(spin)
   # Setup the EditorSpinSlider
   spin.set_min(0)
   spin.set_max(1000)
   spin.connect("value_changed", self, "_spin_changed")


func _spin_changed(value):
    if (updating):
        return
    emit_changed(get_edited_property(), value)


func update_property():
    var new_value = get_edited_object()[get_edited_property()]
    updating = true
    spin.set_value(new_value)
    updating = false