Path: blob/master/editor/script/script_editor_base.h
20854 views
/**************************************************************************/1/* script_editor_base.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "editor/gui/code_editor.h"3334class EditorSyntaxHighlighter;35class MenuButton;36class VSplitContainer;3738class ScriptEditorBase : public Control {39GDCLASS(ScriptEditorBase, Control);4041protected:42Ref<Resource> edited_res;4344static void _bind_methods();4546public:47struct EditedFileData {48String path;49uint64_t last_modified_time = -1;50} edited_file_data;5152virtual String get_name();53virtual Ref<Texture2D> get_theme_icon();5455virtual void set_toggle_list_control(Control *p_toggle_list_control) = 0;56virtual void update_toggle_files_button() = 0;5758virtual bool show_members_overview() { return false; }5960virtual void set_edited_resource(const Ref<Resource> &p_res) = 0;61virtual Ref<Resource> get_edited_resource() const { return edited_res; }6263virtual void apply_code() = 0;64virtual void validate_script() = 0;65virtual bool is_unsaved() = 0;66virtual void tag_saved_version();6768virtual void add_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) {}69virtual Control *get_base_editor() const { return nullptr; }70};7172typedef ScriptEditorBase *(*CreateScriptEditorFunc)(const Ref<Resource> &p_resource);7374class TextEditorBase : public ScriptEditorBase {75GDCLASS(TextEditorBase, ScriptEditorBase);7677void _post_init();7879protected:80enum {81EDIT_UNDO,82EDIT_REDO,83EDIT_CUT,84EDIT_COPY,85EDIT_PASTE,86EDIT_SELECT_ALL,87EDIT_TRIM_TRAILING_WHITESAPCE,88EDIT_TRIM_FINAL_NEWLINES,89EDIT_CONVERT_INDENT_TO_SPACES,90EDIT_CONVERT_INDENT_TO_TABS,91EDIT_MOVE_LINE_UP,92EDIT_MOVE_LINE_DOWN,93EDIT_INDENT,94EDIT_UNINDENT,95EDIT_DELETE_LINE,96EDIT_DUPLICATE_SELECTION,97EDIT_DUPLICATE_LINES,98EDIT_TO_UPPERCASE,99EDIT_TO_LOWERCASE,100EDIT_CAPITALIZE,101EDIT_TOGGLE_FOLD_LINE,102EDIT_FOLD_ALL_LINES,103EDIT_TOGGLE_WORD_WRAP,104EDIT_UNFOLD_ALL_LINES,105EDIT_EMOJI_AND_SYMBOL,106107SEARCH_FIND,108SEARCH_FIND_NEXT,109SEARCH_FIND_PREV,110SEARCH_REPLACE,111SEARCH_IN_FILES,112SEARCH_GOTO_LINE,113114REPLACE_IN_FILES,115116BOOKMARK_TOGGLE,117BOOKMARK_GOTO_NEXT,118BOOKMARK_GOTO_PREV,119BOOKMARK_REMOVE_ALL,120121BASE_ENUM_COUNT,122};123124class EditMenus : public HBoxContainer {125GDCLASS(EditMenus, HBoxContainer);126127protected:128MenuButton *edit_menu = nullptr;129MenuButton *search_menu = nullptr;130MenuButton *goto_menu = nullptr;131PopupMenu *bookmarks_menu = nullptr;132PopupMenu *highlighter_menu = nullptr;133134PopupMenu *edit_menu_line = nullptr;135PopupMenu *edit_menu_fold = nullptr;136PopupMenu *edit_menu_convert_indent = nullptr;137PopupMenu *edit_menu_convert = nullptr;138139TextEditorBase *_get_active_editor();140void _edit_option(int p_op);141void _prepare_edit_menu();142void _update_highlighter_menu();143void _change_syntax_highlighter(int p_idx);144void _update_bookmark_list();145void _bookmark_item_pressed(int p_idx);146147public:148EditMenus();149};150151static void _popup_move_item(int p_target_id, PopupMenu *r_popup, bool p_move_after = true, int p_idx = -1) {152int target_idx = r_popup->get_item_index(p_target_id) + p_move_after;153if (target_idx >= 0 && target_idx < r_popup->get_item_count()) {154r_popup->set_item_index(p_idx, target_idx);155}156}157158static inline EditMenus *edit_menus = nullptr;159160bool editor_enabled = false;161CodeTextEditor *code_editor = nullptr;162HBoxContainer *edit_hb = nullptr;163164GotoLinePopup *goto_line_popup = nullptr;165166LocalVector<Ref<EditorSyntaxHighlighter>> highlighters;167168PopupMenu *context_menu = nullptr;169MenuButton *search_menu = nullptr;170171void _make_context_menu(bool p_selection, bool p_foldable, const Vector2 &p_position = Vector2(0, 0), bool p_show = true);172void _show_context_menu(const Vector2 &p_position);173174virtual void _text_edit_gui_input(const Ref<InputEvent> &p_ev);175virtual bool _edit_option(int p_op);176177virtual void _load_theme_settings();178virtual void _validate_script();179180void _convert_case(CodeTextEditor::CaseStyle p_case) { code_editor->convert_case(p_case); }181182public:183virtual void add_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) override;184virtual void set_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter);185186virtual void set_edited_resource(const Ref<Resource> &p_res) override;187188virtual bool is_unsaved() override;189virtual void tag_saved_version() override;190191virtual void reload_text();192virtual void enable_editor();193194virtual Control *get_edit_menu() = 0;195196virtual Control *get_base_editor() const override { return code_editor->get_text_editor(); }197virtual CodeTextEditor *get_code_editor() const { return code_editor; }198199virtual void set_tooltip_request_func(const Callable &p_toolip_callback);200201virtual void ensure_focus() { code_editor->get_text_editor()->grab_focus(); }202virtual void convert_indent() { code_editor->get_text_editor()->convert_indent(); }203204virtual void trim_trailing_whitespace() { code_editor->trim_trailing_whitespace(); }205virtual void trim_final_newlines() { code_editor->trim_final_newlines(); }206virtual void insert_final_newline() { code_editor->insert_final_newline(); }207208virtual void goto_line(int p_line, int p_column = 0) { code_editor->goto_line(p_line, p_column); }209virtual void goto_line_selection(int p_line, int p_begin, int p_end) { code_editor->goto_line_selection(p_line, p_begin, p_end); }210virtual void goto_line_centered(int p_line, int p_column = 0) { code_editor->goto_line_centered(p_line, p_column); }211virtual void set_executing_line(int p_line) { code_editor->set_executing_line(p_line); }212virtual void clear_executing_line() { code_editor->clear_executing_line(); }213214virtual Variant get_edit_state() { return code_editor->get_edit_state(); }215virtual void set_edit_state(const Variant &p_state);216virtual Variant get_navigation_state() { return code_editor->get_navigation_state(); }217218virtual void update_settings() { code_editor->update_editor_settings(); }219virtual void set_find_replace_bar(FindReplaceBar *p_bar) { code_editor->set_find_replace_bar(p_bar); }220221virtual void validate_script() override { code_editor->validate_script(); }222223virtual void set_toggle_list_control(Control *p_toggle_list_control) override {224code_editor->set_toggle_list_control(p_toggle_list_control);225}226virtual void update_toggle_files_button() override { code_editor->update_toggle_files_button(); }227228TextEditorBase();229~TextEditorBase();230};231232class CodeEditorBase : public TextEditorBase {233GDCLASS(CodeEditorBase, TextEditorBase);234235protected:236enum {237EDIT_COMPLETE = BASE_ENUM_COUNT,238EDIT_TOGGLE_COMMENT,239240CODE_ENUM_COUNT,241};242243class EditMenusCEB : public EditMenus {244GDCLASS(EditMenusCEB, EditMenus);245246public:247EditMenusCEB();248};249250VSplitContainer *editor_box = nullptr;251RichTextLabel *warnings_panel = nullptr;252253virtual void _code_complete_script(const String &p_code, List<ScriptLanguage::CodeCompletionOption> *r_options, bool &r_force) = 0;254virtual bool _warning_clicked(const Variant &p_line);255256public:257virtual bool show_members_overview() override { return true; }258259virtual Vector<String> get_functions() { return Vector<String>(); }260261virtual PackedInt32Array get_breakpoints() { return PackedInt32Array(); }262virtual void set_breakpoint(int p_line, bool p_enabled) {}263virtual void clear_breakpoints() {}264265CodeEditorBase();266};267268269