diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml new file mode 100644 index 0000000..0224617 --- /dev/null +++ b/.github/workflows/linux.yml @@ -0,0 +1,89 @@ +name: 🐧 Linux Builds +on: + push: + branches: [main, github_actions] + pull_request: + branches: [main] + +# Global Cache Settings +env: + GODOT_BASE_BRANCH: master + SCONS_CACHE_LIMIT: 4096 + +jobs: + linux-editor: + runs-on: "ubuntu-20.04" + name: Editor + + steps: + # Clone Godot + - uses: actions/checkout@v2 + with: + repository: godotengine/godot + ref: master + + # Clone our module under the correct directory + - uses: actions/checkout@v2 + with: + path: modules/visual_script + + # Azure repositories are not reliable, we need to prevent azure giving us packages. + - name: Make apt sources.list use the default Ubuntu repositories + run: | + sudo rm -f /etc/apt/sources.list.d/* + sudo cp -f misc/ci/sources.list /etc/apt/sources.list + sudo apt-get update + + # Install all packages (except scons) + - name: Configure dependencies + run: | + sudo apt-get install build-essential pkg-config libx11-dev libxcursor-dev \ + libxinerama-dev libgl1-mesa-dev libglu-dev libasound2-dev libpulse-dev libudev-dev libxi-dev libxrandr-dev yasm + + # Upload cache on completion and check it out now + - name: Load .scons_cache directory + id: linux-editor-cache + uses: actions/cache@v2 + with: + path: ${{github.workspace}}/.scons_cache/ + key: ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + restore-keys: | + ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}} + ${{github.job}}-${{env.GODOT_BASE_BRANCH}} + + # Use python 3.x release (works cross platform; best to keep self contained in it's own step) + - name: Set up Python 3.x + uses: actions/setup-python@v2 + with: + # Semantic version range syntax or exact version of a Python version + python-version: "3.x" + # Optional - x64 or x86 architecture, defaults to x64 + architecture: "x64" + + # Setup scons, print python version and scons version info, so if anything is broken it won't run the build. + - name: Configuring Python packages + run: | + python -c "import sys; print(sys.version)" + python -m pip install scons + python --version + scons --version + + # We should always be explicit with our flags usage here since it's gonna be sure to always set those flags + - name: Compilation + env: + SCONS_CACHE: ${{github.workspace}}/.scons_cache/ + run: | + scons -j2 verbose=yes warnings=all werror=yes platform=linuxbsd tools=yes tests=no target=release_debug production=yes + + # TODO Such tests are able to run from Godot 4.0 only + # Execute unit tests for the editor + #- name: Unit Tests + # run: | + # ./bin/godot.linuxbsd.opt.tools.64 --test + + # Make build available + - uses: actions/upload-artifact@v2 + with: + name: godot.linuxbsd.opt.tools.64 + path: bin/godot.linuxbsd.opt.tools.64 diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml new file mode 100644 index 0000000..8d4cb90 --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,76 @@ +name: 🍎 Macos Builds +on: + push: + branches: [main, github_actions] + pull_request: + branches: [main] + +# Global Cache Settings +env: + GODOT_BASE_BRANCH: master + SCONS_CACHE_LIMIT: 4096 + +jobs: + macos-editor: + runs-on: "macos-10.15" + name: Editor + + steps: + # Clone Godot + - uses: actions/checkout@v2 + with: + repository: godotengine/godot + ref: master + + # Clone our module under the correct directory + - uses: actions/checkout@v2 + with: + path: modules/visual_script + + # Upload cache on completion and check it out now + - name: Load .scons_cache directory + id: macos-editor-cache + uses: actions/cache@v2 + with: + path: ${{github.workspace}}/.scons_cache/ + key: ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + restore-keys: | + ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}} + ${{github.job}}-${{env.GODOT_BASE_BRANCH}} + + # Use python 3.x release (works cross platform; best to keep self contained in it's own step) + - name: Set up Python 3.x + uses: actions/setup-python@v2 + with: + # Semantic version range syntax or exact version of a Python version + python-version: "3.x" + # Optional - x64 or x86 architecture, defaults to x64 + architecture: "x64" + + # Setup scons, print python version and scons version info, so if anything is broken it won't run the build. + - name: Configuring Python packages + run: | + python -c "import sys; print(sys.version)" + python -m pip install scons + python --version + scons --version + + # We should always be explicit with our flags usage here since it's gonna be sure to always set those flags + - name: Compilation + env: + SCONS_CACHE: ${{github.workspace}}/.scons_cache/ + run: | + scons -j2 verbose=yes warnings=all werror=yes platform=osx tools=yes tests=no target=release_debug production=yes module_text_server_fb_enabled=yes + + # TODO Such tests are able to run from Godot 4.0 only + # Execute unit tests for the editor + #- name: Unit Tests + # run: | + # ./bin/godot.linuxbsd.opt.tools.64 --test + + # Make build available + - uses: actions/upload-artifact@v2 + with: + name: godot.osx.opt.tools.64 + path: bin/godot.osx.opt.tools.64 diff --git a/.github/workflows/scripts/clang_format.sh b/.github/workflows/scripts/clang_format.sh new file mode 100644 index 0000000..884446b --- /dev/null +++ b/.github/workflows/scripts/clang_format.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash + +# This script runs clang-format and fixes copyright headers on all relevant files in the repo. +# This is the primary script responsible for fixing style violations. + +set -uo pipefail +IFS=$'\n\t' + +CLANG_FORMAT_FILE_EXTS=(".c" ".h" ".cpp" ".hpp" ".cc" ".hh" ".cxx" ".m" ".mm" ".inc" ".java" ".glsl") + +# Loops through all text files tracked by Git. +git grep -zIl '' | +while IFS= read -rd '' f; do + # Exclude 3rd party files. + if [[ "$f" == "glad"* ]]; then + continue + elif [[ "$f" == "godot-cpp"* ]]; then + continue + elif [[ "$f" == "thirdparty"* ]]; then + continue + elif [[ "$f" == "gradle"* ]]; then + continue + elif [[ "$f" == "build"* ]]; then + continue + elif [[ "$f" == "android"* ]]; then + continue + elif [[ "$f" == ".github"* ]]; then + continue + fi + for extension in ${CLANG_FORMAT_FILE_EXTS[@]}; do + if [[ "$f" == *"$extension" ]]; then + # Run clang-format. + clang-format -i "$f" + fi + done +done + +git diff > patch.patch + +# If no patch has been generated all is OK, clean up, and exit. +if [ ! -s patch.patch ] ; then + printf "Files in this commit comply with the clang-format style rules.\n" + rm -f patch.patch + exit 0 +fi + +# A patch has been created, notify the user, clean up, and exit. +printf "\n*** The following differences were found between the code " +printf "and the formatting rules:\n\n" +cat patch.patch +printf "\n*** Aborting, please fix your commit(s) with 'git commit --amend' or 'git rebase -i '\n" +rm -f patch.patch +exit 1 diff --git a/.github/workflows/scripts/file_format.sh b/.github/workflows/scripts/file_format.sh new file mode 100644 index 0000000..b2c64ba --- /dev/null +++ b/.github/workflows/scripts/file_format.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash + +# This script ensures proper POSIX text file formatting and a few other things. +# This is supplementary to clang_format.sh, but should be run before it. + +# We need dos2unix and recode. +if [ ! -x "$(command -v dos2unix)" -o ! -x "$(command -v recode)" ]; then + printf "Install 'dos2unix' and 'recode' to use this script.\n" +fi + +set -uo pipefail +IFS=$'\n\t' + +# Loops through all text files tracked by Git. +git grep -zIl '' | +while IFS= read -rd '' f; do + # Exclude 3rd party files + if [[ "$f" == "glad"* ]]; then + continue + elif [[ "$f" == "godot-cpp"* ]]; then + continue + elif [[ "$f" == "thirdparty"* ]]; then + continue + elif [[ "$f" == "gradle"* ]]; then + continue + elif [[ "$f" == "build"* ]]; then + continue + elif [[ "$f" == "android"* ]]; then + continue + elif [[ "$f" == "api.json" ]]; then + continue + fi + # Ensure that files are UTF-8 formatted. + recode UTF-8 "$f" 2> /dev/null + # Ensure that files have LF line endings and do not contain a BOM. + dos2unix "$f" 2> /dev/null + # Remove trailing space characters and ensures that files end + # with newline characters. -l option handles newlines conveniently. + perl -i -ple 's/\s*$//g' "$f" + # Remove the character sequence "== true" if it has a leading space. + perl -i -pe 's/\x20== true//g' "$f" + # We don't want to change lines around braces in godot/tscn files. + if [[ "$f" == *"godot" ]]; then + continue + elif [[ "$f" == *"tscn" ]]; then + continue + fi + # Disallow empty lines after the opening brace. + sed -z -i 's/\x7B\x0A\x0A/\x7B\x0A/g' "$f" + # Disallow some empty lines before the closing brace. + sed -z -i 's/\x0A\x0A\x7D/\x0A\x7D/g' "$f" +done + +git diff > patch.patch + +# If no patch has been generated all is OK, clean up, and exit. +if [ ! -s patch.patch ] ; then + printf "Files in this commit comply with the formatting rules.\n" + rm -f patch.patch + exit 0 +fi + +# A patch has been created, notify the user, clean up, and exit. +printf "\n*** The following differences were found between the code " +printf "and the formatting rules:\n\n" +cat patch.patch +printf "\n*** Aborting, please fix your commit(s) with 'git commit --amend' or 'git rebase -i '\n" +rm -f patch.patch +exit 1 diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml new file mode 100644 index 0000000..33d0cc6 --- /dev/null +++ b/.github/workflows/static_checks.yml @@ -0,0 +1,26 @@ +name: 📊 Static Checks +on: [push, pull_request] + +concurrency: + group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-static-checks + cancel-in-progress: true + +jobs: + static-checks: + name: Formatting (clang-format, file format) + runs-on: ubuntu-20.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Install dependencies + run: | + sudo apt-get install -qq dos2unix recode clang-format + + - name: File formatting checks (file_format.sh) + run: | + bash ./.github/workflows/scripts/file_format.sh + + - name: Style checks via clang-format (clang_format.sh) + run: | + bash ./.github/workflows/scripts/clang_format.sh diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000..3ee9b6d --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,146 @@ +name: 🚪 Windows Builds +on: + push: + branches: [main, github_actions] + pull_request: + branches: [main] + +# Global Cache Settings +# SCONS_CACHE for windows must be set in the build environment +env: + GODOT_BASE_BRANCH: master + SCONS_CACHE_MSVC_CONFIG: true + SCONS_CACHE_LIMIT: 4096 + +jobs: + windows-editor: + # Windows 10 with latest image + runs-on: "windows-latest" + name: Editor + + steps: + # Clone Godot + - uses: actions/checkout@v2 + with: + repository: v-sekai/godot + ref: groups-4.x + + # Clone our module under the correct directory + - uses: actions/checkout@v2 + with: + path: modules/visual_script + + # Upload cache on completion and check it out now + # Editing this is pretty dangerous for Windows since it can break and needs to be properly tested with a fresh cache. + - name: Load .scons_cache directory + id: windows-editor-cache + uses: actions/cache@v2 + with: + path: /.scons_cache/ + key: ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + restore-keys: | + ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}} + ${{github.job}}-${{env.GODOT_BASE_BRANCH}} + + # Use python 3.x release (works cross platform; best to keep self contained in it's own step) + - name: Set up Python 3.x + uses: actions/setup-python@v2 + with: + # Semantic version range syntax or exact version of a Python version + python-version: "3.x" + # Optional - x64 or x86 architecture, defaults to x64 + architecture: "x64" + + # Setup scons, print python version and scons version info, so if anything is broken it won't run the build. + - name: Configuring Python packages + run: | + python -c "import sys; print(sys.version)" + python -m pip install scons pywin32 + python --version + scons --version + + # We should always be explicit with our flags usage here since it's gonna be sure to always set those flags + - name: Compilation + env: + SCONS_CACHE: /.scons_cache/ + run: | + scons -j2 verbose=yes warnings=all werror=yes platform=windows tools=yes tests=no target=release_debug + + # TODO Such tests are able to run from Godot 4.0 only + # Execute unit tests for the editor + #- name: Unit Tests + # run: | + # ./bin/godot.windows.opt.tools.64.exe --test + + # Make build available + - uses: actions/upload-artifact@v2 + with: + name: godot.windows.opt.tools.64.exe + path: bin/godot.windows.opt.tools.64.exe + + windows-template: + # Windows 10 with latest image + runs-on: "windows-latest" + name: Release + + steps: + # Clone Godot + - uses: actions/checkout@v2 + with: + repository: v-sekai/godot + ref: groups-4.x + + # Clone our module under the correct directory + - uses: actions/checkout@v2 + with: + path: modules/visual_script + + # Upload cache on completion and check it out now + # Editing this is pretty dangerous for Windows since it can break and needs to be properly tested with a fresh cache. + - name: Load .scons_cache directory + id: windows-editor-cache + uses: RevoluPowered/cache@v2.1 + with: + path: /.scons_cache/ + key: ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + restore-keys: | + ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + ${{github.job}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}} + ${{github.job}}-${{env.GODOT_BASE_BRANCH}} + + # Use python 3.x release (works cross platform; best to keep self contained in it's own step) + - name: Set up Python 3.x + uses: actions/setup-python@v2 + with: + # Semantic version range syntax or exact version of a Python version + python-version: "3.x" + # Optional - x64 or x86 architecture, defaults to x64 + architecture: "x64" + + # Setup scons, print python version and scons version info, so if anything is broken it won't run the build. + - name: Configuring Python packages + run: | + python -c "import sys; print(sys.version)" + python -m pip install scons pywin32 + python --version + scons --version + + # We should always be explicit with our flags usage here since it's gonna be sure to always set those flags + - name: Compilation + env: + SCONS_CACHE: /.scons_cache/ + run: | + scons -j2 verbose=yes warnings=all werror=yes platform=windows tools=no tests=no target=release + + # TODO Such tests are able to run from Godot 4.0 only + # Execute unit tests for the editor + #- name: Unit Tests + # run: | + # ./bin/godot.windows.opt.tools.64.exe --test + + # Make build available + - uses: actions/upload-artifact@v2 + with: + name: godot.windows.opt.64.exe + path: bin/godot.windows.opt.64.exe diff --git a/SCsub b/SCsub index b91ccea..f793c4d 100644 --- a/SCsub +++ b/SCsub @@ -7,5 +7,5 @@ env_vs = env_modules.Clone() env_vs.add_source_files(env.modules_sources, "*.cpp") -if env["tools"]: +if env["target"] == "editor": env_vs.add_source_files(env.modules_sources, "editor/*.cpp") diff --git a/editor/visual_script_editor.cpp b/editor/visual_script_editor.cpp index 73140d5..1795bf0 100644 --- a/editor/visual_script_editor.cpp +++ b/editor/visual_script_editor.cpp @@ -48,6 +48,7 @@ #include "scene/gui/graph_edit.h" #include "scene/gui/separator.h" #include "scene/gui/view_panner.h" +#include "editor/inspector_dock.h" #include "scene/main/window.h" #ifdef TOOLS_ENABLED @@ -1404,7 +1405,7 @@ void VisualScriptEditor::_create_function_dialog() { func_name_box->grab_focus(); for (int i = 0; i < func_input_vbox->get_child_count(); i++) { Node *nd = func_input_vbox->get_child(i); - nd->queue_delete(); + nd->queue_free(); } } @@ -1497,7 +1498,7 @@ void VisualScriptEditor::_add_func_input() { void VisualScriptEditor::_remove_func_input(Node *p_node) { func_input_vbox->remove_child(p_node); - p_node->queue_delete(); + p_node->queue_free(); } void VisualScriptEditor::_deselect_input_names() { @@ -2700,7 +2701,7 @@ void VisualScriptEditor::set_edited_resource(const Ref &p_res) { call_deferred(SNAME("_update_members")); } -void VisualScriptEditor::enable_editor() { +void VisualScriptEditor::enable_editor(Control *p_shortcut_context) { } Vector VisualScriptEditor::get_functions() { diff --git a/editor/visual_script_editor.h b/editor/visual_script_editor.h index 0378da9..8bcae24 100644 --- a/editor/visual_script_editor.h +++ b/editor/visual_script_editor.h @@ -33,6 +33,7 @@ #include "../visual_script.h" #include "editor/create_dialog.h" +#include "editor/editor_inspector.h" #include "editor/plugins/script_editor_plugin.h" #include "visual_script_property_selector.h" @@ -65,10 +66,8 @@ public: class VisualScriptEditor : public ScriptEditorBase { GDCLASS(VisualScriptEditor, ScriptEditorBase); - enum { - TYPE_SEQUENCE = 1000, - INDEX_BASE_SEQUENCE = 1024 - }; + enum { TYPE_SEQUENCE = 1000, + INDEX_BASE_SEQUENCE = 1024 }; enum { EDIT_ADD_NODE, @@ -91,16 +90,12 @@ class VisualScriptEditor : public ScriptEditorBase { CREATE_ACTION, }; - enum MemberAction { - MEMBER_EDIT, - MEMBER_REMOVE - }; + enum MemberAction { MEMBER_EDIT, + MEMBER_REMOVE }; - enum MemberType { - MEMBER_FUNCTION, + enum MemberType { MEMBER_FUNCTION, MEMBER_VARIABLE, - MEMBER_SIGNAL - }; + MEMBER_SIGNAL }; VBoxContainer *members_section = nullptr; MenuButton *edit_menu = nullptr; @@ -203,17 +198,22 @@ class VisualScriptEditor : public ScriptEditorBase { void _port_action_menu(int p_option); - void connect_data(Ref vnode_old, Ref vnode, int new_id); + void connect_data(Ref vnode_old, + Ref vnode, int new_id); NodePath drop_path; Node *drop_node = nullptr; Vector2 drop_position; - void _selected_connect_node(const String &p_text, const String &p_category, const bool p_connecting = true); - void connect_seq(Ref vnode_old, Ref vnode_new, int new_id); + void _selected_connect_node(const String &p_text, const String &p_category, + const bool p_connecting = true); + void connect_seq(Ref vnode_old, + Ref vnode_new, int new_id); void _cancel_connect_node(); int _create_new_node_from_name(const String &p_text, const Vector2 &p_point); - void _selected_new_virtual_method(const String &p_text, const String &p_category, const bool p_connecting); + void _selected_new_virtual_method(const String &p_text, + const String &p_category, + const bool p_connecting); int error_line = -1; @@ -231,20 +231,26 @@ class VisualScriptEditor : public ScriptEditorBase { void _end_node_move(); void _move_node(int p_id, const Vector2 &p_to); - void _get_ends(int p_node, const List &p_seqs, const RBSet &p_selected, RBSet &r_end_nodes); + void _get_ends(int p_node, + const List &p_seqs, + const RBSet &p_selected, RBSet &r_end_nodes); void _node_moved(Vector2 p_from, Vector2 p_to, int p_id); void _remove_node(int p_id); - void _graph_connected(const String &p_from, int p_from_slot, const String &p_to, int p_to_slot); - void _graph_disconnected(const String &p_from, int p_from_slot, const String &p_to, int p_to_slot); - void _graph_connect_to_empty(const String &p_from, int p_from_slot, const Vector2 &p_release_pos); + void _graph_connected(const String &p_from, int p_from_slot, + const String &p_to, int p_to_slot); + void _graph_disconnected(const String &p_from, int p_from_slot, + const String &p_to, int p_to_slot); + void _graph_connect_to_empty(const String &p_from, int p_from_slot, + const Vector2 &p_release_pos); void _node_ports_changed(int p_id); void _node_create(); void _update_available_nodes(); - void _member_button(Object *p_item, int p_column, int p_button, MouseButton p_mouse_button); + void _member_button(Object *p_item, int p_column, int p_button, + MouseButton p_mouse_button); void _expression_text_changed(const String &p_text, int p_id); void _add_input_port(int p_id); @@ -253,10 +259,12 @@ class VisualScriptEditor : public ScriptEditorBase { void _remove_output_port(int p_id, int p_port); void _change_port_type(int p_select, int p_id, int p_port, bool is_input); void _update_node_size(int p_id); - void _port_name_focus_out(const Node *p_name_box, int p_id, int p_port, bool is_input); + void _port_name_focus_out(const Node *p_name_box, int p_id, int p_port, + bool is_input); Vector2 _get_pos_in_graph(Vector2 p_point) const; - Vector2 _get_available_pos(bool p_centered = true, Vector2 p_pos = Vector2()) const; + Vector2 _get_available_pos(bool p_centered = true, + Vector2 p_pos = Vector2()) const; bool node_has_sequence_connections(int p_id); @@ -284,8 +292,10 @@ class VisualScriptEditor : public ScriptEditorBase { void _on_nodes_duplicate(); Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); - bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; - void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); + bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, + Control *p_from) const; + void drop_data_fw(const Point2 &p_point, const Variant &p_data, + Control *p_from); int editing_id = 0; int editing_input = 0; @@ -294,7 +304,9 @@ class VisualScriptEditor : public ScriptEditorBase { int data_disconnect_node = 0; int data_disconnect_port = 0; - void _default_value_changed(const StringName &p_property, const Variant &p_value, const String &p_field, bool p_changing); + void _default_value_changed(const StringName &p_property, + const Variant &p_value, const String &p_field, + bool p_changing); void _default_value_edited(Node *p_button, int p_id, int p_input_port); void _menu_option(int p_what); @@ -303,9 +315,14 @@ class VisualScriptEditor : public ScriptEditorBase { void _comment_node_resized(const Vector2 &p_new_size, int p_node); void _draw_color_over_button(Object *obj, Color p_color); - void _button_resource_previewed(const String &p_path, const Ref &p_preview, const Ref &p_small_preview, Variant p_ud); + void _button_resource_previewed(const String &p_path, + const Ref &p_preview, + const Ref &p_small_preview, + Variant p_ud); - VisualScriptNode::TypeGuess _guess_output_type(int p_port_action_node, int p_port_action_output, RBSet &p_visited_nodes); + VisualScriptNode::TypeGuess _guess_output_type(int p_port_action_node, + int p_port_action_output, + RBSet &p_visited_nodes); void _member_rmb_selected(const Vector2 &p_pos, MouseButton p_button); void _member_option(int p_option); @@ -317,13 +334,15 @@ protected: static void _bind_methods(); public: - virtual void add_syntax_highlighter(Ref p_highlighter) override; - virtual void set_syntax_highlighter(Ref p_highlighter) override; + virtual void + add_syntax_highlighter(Ref p_highlighter) override; + virtual void + set_syntax_highlighter(Ref p_highlighter) override; virtual void apply_code() override; virtual Ref get_edited_resource() const override; virtual void set_edited_resource(const Ref &p_res) override; - virtual void enable_editor() override; + virtual void enable_editor(Control *p_shortcut_context) override; virtual Vector get_functions() override; virtual void reload_text() override; virtual String get_name() override; @@ -344,16 +363,21 @@ public: virtual PackedInt32Array get_breakpoints() override; virtual void set_breakpoint(int p_line, bool p_enable) override{}; virtual void clear_breakpoints() override{}; - virtual void add_callback(const String &p_function, PackedStringArray p_args) override; + virtual void add_callback(const String &p_function, + PackedStringArray p_args) override; virtual void update_settings() override; virtual bool show_members_overview() override; virtual void set_debugger_active(bool p_active) override; - virtual void set_tooltip_request_func(const Callable &p_toolip_callback) override; + virtual void + set_tooltip_request_func(const Callable &p_toolip_callback) override; virtual Control *get_edit_menu() override; virtual void clear_edit_menu() override; - virtual void set_find_replace_bar(FindReplaceBar *p_bar) override { p_bar->hide(); }; // Not needed here. + virtual void set_find_replace_bar(FindReplaceBar *p_bar) override { + p_bar->hide(); + }; // Not needed here. virtual bool can_lose_focus_on_node_selection() override { return false; } virtual void validate() override; + virtual Variant get_navigation_state() override { return Variant(); } virtual Control *get_base_editor() const override; @@ -383,7 +407,8 @@ protected: public: static VisualScriptCustomNodes *get_singleton() { return singleton; } - void add_custom_node(const String &p_name, const String &p_category, const Ref