diff --git a/tutorials/plugins/editor/inspector_plugins.rst b/tutorials/plugins/editor/inspector_plugins.rst index 3bf95e310..24f1e5203 100644 --- a/tutorials/plugins/editor/inspector_plugins.rst +++ b/tutorials/plugins/editor/inspector_plugins.rst @@ -1,84 +1,91 @@ .. _doc_inspector_plugins: -Inspector Plugins -===================== +Inspector plugins +================= -Introduction ------------- +The inspector dock supports custom plugins to create your own widgets for +editing properties. This tutorial explains how to use the +:ref:`class_EditorInspectorPlugin` and :ref:`class_EditorProperty` classes to +write such plugins with the example of creating a custom value editor. -Godot 3.1 comes with a new inspector. Adding plugins to it is now possible. +.. note:: -This tutorial will explain the process. + To register these scripts as a new editor plugin, you have to create a + ``plugin.cfg`` file as described in :ref:`doc_making_plugins`. +EditorInspectorPlugin +--------------------- -Inspector Plugin ----------------- - -This short tutorial will explain how to make a simple value editor. -Create an EditorInspectorPlugin first. This is needed to initialize your plugin. - +We start by creating a script extending the :ref:`class_EditorInspectorPlugin` +class. This is needed to initialize the plugin and add the custom property +editor that we'll later define. .. tabs:: .. code-tab:: gdscript GDScript - - # MyEditorPlugin.gd - + + # MyInspectorPlugin.gd + extends EditorInspectorPlugin - + func can_handle(object): - # if only editing a specific type - # return object is TheTypeIWant - # if everything is supported + # 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): - if (type==TYPE_INT): - add_custom_property_editor(path,MyEditor.new()) - return true # I want this one + 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_custom_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 + return false +EditorProperty +-------------- -Editor ------- - - -Here is an editor for editing integers +Next, we define the actual :ref:`class_EditorProperty` custom value editor that +we want instantiated to edit integers. This is a custom :ref:`class_Control` and +we can add any kinds of additional nodes to make advanced widgets to embed in +the inspector. .. tabs:: .. code-tab:: gdscript GDScript - - # MyEditor.gd + + # MyIntEditor.gd extends EditorProperty - class_name MyEditor + 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 ) + 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 - - var spin = EditorSpinSlider.new() # use the new spin slider - func _init(): - # if you want to put the editor below the label - # set_bottom_editor( spin ) - # else use: - add_child( spin ) - # to remember focus when selected back - add_focusable( spin ) - spin.set_min(0) - spin.set_max(1000) - spin.connect("value_changed",self,"_spin_changed") - - - - + var new_value = get_edited_object()[get_edited_property()] + updating = true + spin.set_value(new_value) + updating = false diff --git a/tutorials/plugins/editor/visual_shader_plugins.rst b/tutorials/plugins/editor/visual_shader_plugins.rst index aa78538a3..6f86efe65 100644 --- a/tutorials/plugins/editor/visual_shader_plugins.rst +++ b/tutorials/plugins/editor/visual_shader_plugins.rst @@ -1,33 +1,34 @@ .. _doc_visual_shader_plugins: -Visual Shader Plugins +Visual Shader plugins ===================== -Introduction ------------- +Visual Shader plugins are used to create custom :ref:`class_VisualShader` nodes +in GDScript. -Visual Shader Plugins are used to create custom Visual Shader nodes in GDScript. +The creation process is different from usual editor plugins. You do not need to +create a ``plugin.cfg`` file to register it; instead, create and save a script +file and it will be ready to use, provided the custom node is registered with +``class_name``. -The creation process is different from EditorPlugins - you simply create and save a script file and it will be ready to use. +This short tutorial will explain how to make a Perlin-3D noise node (original +code from this `GPU noise shaders plugin +`_. -Visual Shader Plugin --------------------- - -This short tutorial will explain how to make a Perlin-3D noise node (original code from https://github.com/curly-brace/Godot-3.0-Noise-Shaders/blob/master/assets/gpu_noise_shaders/classic_perlin3d.tres). - -Create a sprite and assign a :ref:`ShaderMaterial ` to its material slot: +Create a Sprite and assign a :ref:`class_ShaderMaterial` to its material slot: .. image:: img/visual_shader_plugins_start.png -Assign :ref:`VisualShader ` to the shader slot of the material: +Assign :ref:`class_VisualShader` to the shader slot of the material: .. image:: img/visual_shader_plugins_start2.png -Don't forget to change its mode to CanvasItem (if you are using a sprite): +Don't forget to change its mode to "CanvasItem" (if you are using a Sprite): .. image:: img/visual_shader_plugins_start3.png -Create a script which derives from :ref:`VisualShaderNodeCustom `. This is all you need to initialize your plugin. +Create a script which derives from :ref:`class_VisualShaderNodeCustom`. This is +all you need to initialize your plugin. :: @@ -94,7 +95,7 @@ Create a script which derives from :ref:`VisualShaderNodeCustom