diff options
Diffstat (limited to 'scene/gui/text_edit.h')
-rw-r--r-- | scene/gui/text_edit.h | 563 |
1 files changed, 291 insertions, 272 deletions
diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h index c7829fcc1c..5d05e07b5d 100644 --- a/scene/gui/text_edit.h +++ b/scene/gui/text_edit.h @@ -70,6 +70,47 @@ public: GUTTER_TYPE_CUSTOM }; + /* Contex Menu. */ + enum MenuItems { + MENU_CUT, + MENU_COPY, + MENU_PASTE, + MENU_CLEAR, + MENU_SELECT_ALL, + MENU_UNDO, + MENU_REDO, + MENU_DIR_INHERITED, + MENU_DIR_AUTO, + MENU_DIR_LTR, + MENU_DIR_RTL, + MENU_DISPLAY_UCC, + MENU_INSERT_LRM, + MENU_INSERT_RLM, + MENU_INSERT_LRE, + MENU_INSERT_RLE, + MENU_INSERT_LRO, + MENU_INSERT_RLO, + MENU_INSERT_PDF, + MENU_INSERT_ALM, + MENU_INSERT_LRI, + MENU_INSERT_RLI, + MENU_INSERT_FSI, + MENU_INSERT_PDI, + MENU_INSERT_ZWJ, + MENU_INSERT_ZWNJ, + MENU_INSERT_WJ, + MENU_INSERT_SHY, + MENU_MAX + + }; + + /* Search. */ + enum SearchFlags { + SEARCH_MATCH_CASE = 1, + SEARCH_WHOLE_WORDS = 2, + SEARCH_BACKWARDS = 4 + }; + private: struct GutterInfo { GutterType type = GutterType::GUTTER_TYPE_STRING; @@ -82,11 +123,6 @@ private: ObjectID custom_draw_obj = ObjectID(); StringName custom_draw_callback; }; - Vector<GutterInfo> gutters; - int gutters_width = 0; - int gutter_padding = 0; - - void _update_gutter_width(); class Text { public: @@ -135,7 +171,7 @@ private: void set_font(const Ref<Font> &p_font); void set_font_size(int p_font_size); void set_font_features(const Dictionary &p_features); - void set_direction_and_language(TextServer::Direction p_direction, String p_language); + void set_direction_and_language(TextServer::Direction p_direction, const String &p_language); void set_draw_control_chars(bool p_draw_control_chars); int get_line_height(int p_line, int p_wrap_index) const; @@ -173,7 +209,7 @@ private: void set_line_gutter_text(int p_line, int p_gutter, const String &p_text) { text.write[p_line].gutters.write[p_gutter].text = p_text; } const String &get_line_gutter_text(int p_line, int p_gutter) const { return text[p_line].gutters[p_gutter].text; } - void set_line_gutter_icon(int p_line, int p_gutter, Ref<Texture2D> p_icon) { text.write[p_line].gutters.write[p_gutter].icon = p_icon; } + void set_line_gutter_icon(int p_line, int p_gutter, const Ref<Texture2D> &p_icon) { text.write[p_line].gutters.write[p_gutter].icon = p_icon; } const Ref<Texture2D> &get_line_gutter_icon(int p_line, int p_gutter) const { return text[p_line].gutters[p_gutter].icon; } void set_line_gutter_item_color(int p_line, int p_gutter, const Color &p_color) { text.write[p_line].gutters.write[p_gutter].color = p_color; } @@ -187,15 +223,102 @@ private: const Color get_line_background_color(int p_line) const { return text[p_line].background_color; } }; - /* Text manipulation */ - // User control. + /* Text */ + Text text; + + bool setting_text = false; + + // Text properties. + String ime_text = ""; + Point2 ime_selection; + /* Initialise to opposite first, so we get past the early-out in set_editable. */ bool editable = false; + TextDirection text_direction = TEXT_DIRECTION_AUTO; + TextDirection input_direction = TEXT_DIRECTION_LTR; + + Dictionary opentype_features; + String language = ""; + + Control::StructuredTextParser st_parser = STRUCTURED_TEXT_DEFAULT; + Array st_args; + + void _clear(); + void _update_caches(); + + // User control. bool overtype_mode = false; + bool context_menu_enabled = true; + bool shortcut_keys_enabled = true; + bool virtual_keyboard_enabled = true; + // Overridable actions String cut_copy_line = ""; + // Context menu. + PopupMenu *menu = nullptr; + PopupMenu *menu_dir = nullptr; + PopupMenu *menu_ctl = nullptr; + + void _generate_context_menu(); + int _get_menu_action_accelerator(const String &p_action); + + /* Versioning */ + struct TextOperation { + enum Type { + TYPE_NONE, + TYPE_INSERT, + TYPE_REMOVE + }; + + Type type = TYPE_NONE; + int from_line = 0; + int from_column = 0; + int to_line = 0; + int to_column = 0; + String text; + uint32_t prev_version = 0; + uint32_t version = 0; + bool chain_forward = false; + bool chain_backward = false; + }; + + bool undo_enabled = true; + int undo_stack_max_size = 50; + + bool next_operation_is_complex = false; + + TextOperation current_op; + List<TextOperation> undo_stack; + List<TextOperation>::Element *undo_stack_pos = nullptr; + + Timer *idle_detect; + + uint32_t version = 0; + uint32_t saved_version = 0; + + void _push_current_op(); + void _do_text_op(const TextOperation &p_op, bool p_reverse); + void _clear_redo(); + + /* Search */ + Color search_result_color = Color(1, 1, 1); + Color search_result_border_color = Color(1, 1, 1); + + String search_text = ""; + uint32_t search_flags = 0; + + int _get_column_pos_of_word(const String &p_key, const String &p_search, uint32_t p_search_flags, int p_from_column) const; + + /* Tooltip. */ + Object *tooltip_obj = nullptr; + StringName tooltip_func; + Variant tooltip_ud; + + /* Mouse */ + int _get_char_pos_for_line(int p_px, int p_line, int p_wrap_index = 0) const; + /* Caret. */ struct Caret { Point2 draw_pos; @@ -230,6 +353,8 @@ private: void _reset_caret_blink_timer(); void _toggle_draw_caret(); + int _get_column_x_offset_for_line(int p_char, int p_line) const; + /* Selection. */ struct Selection { SelectionMode selecting_mode = SelectionMode::SELECTION_MODE_NONE; @@ -296,6 +421,7 @@ private: bool updating_scrolls = false; void _update_scrollbars(); + int _get_control_height() const; void _v_scroll_input(); void _scroll_moved(double p_to_val); @@ -327,122 +453,62 @@ private: void _update_minimap_click(); void _update_minimap_drag(); - /* Syntax highlighting. */ - Map<int, Dictionary> syntax_highlighting_cache; - - struct TextOperation { - enum Type { - TYPE_NONE, - TYPE_INSERT, - TYPE_REMOVE - }; - - Type type = TYPE_NONE; - int from_line = 0; - int from_column = 0; - int to_line = 0; - int to_column = 0; - String text; - uint32_t prev_version = 0; - uint32_t version = 0; - bool chain_forward = false; - bool chain_backward = false; - }; - - String ime_text; - Point2 ime_selection; - - TextOperation current_op; - - List<TextOperation> undo_stack; - List<TextOperation>::Element *undo_stack_pos = nullptr; - int undo_stack_max_size; + /* Gutters. */ + Vector<GutterInfo> gutters; + int gutters_width = 0; + int gutter_padding = 0; - void _clear_redo(); - void _do_text_op(const TextOperation &p_op, bool p_reverse); + void _update_gutter_width(); - //syntax coloring + /* Syntax highlighting. */ Ref<SyntaxHighlighter> syntax_highlighter; - Set<String> keywords; + Map<int, Dictionary> syntax_highlighting_cache; Dictionary _get_line_syntax_highlighting(int p_line); - bool setting_text = false; + /* Visual. */ + Ref<StyleBox> style_normal; + Ref<StyleBox> style_focus; + Ref<StyleBox> style_readonly; - // data - Text text; + Ref<Texture2D> tab_icon; + Ref<Texture2D> space_icon; - Dictionary opentype_features; - String language; - TextDirection text_direction = TEXT_DIRECTION_AUTO; - TextDirection input_direction = TEXT_DIRECTION_LTR; - Control::StructuredTextParser st_parser = STRUCTURED_TEXT_DEFAULT; - Array st_args; - bool draw_control_chars = false; + Ref<Font> font; + int font_size = 16; + Color font_color = Color(1, 1, 1); + Color font_readonly_color = Color(1, 1, 1); - uint32_t version = 0; - uint32_t saved_version = 0; + int outline_size = 0; + Color outline_color = Color(1, 1, 1); - bool window_has_focus = true; + int line_spacing = 1; + + Color background_color = Color(1, 1, 1); + Color current_line_color = Color(1, 1, 1); + Color word_highlighted_color = Color(1, 1, 1); + bool window_has_focus = true; bool first_draw = true; - bool draw_tabs = false; - bool draw_spaces = false; - bool text_changed_dirty = false; - bool undo_enabled = true; - bool highlight_all_occurrences = false; bool highlight_current_line = false; + bool highlight_all_occurrences = false; + bool draw_control_chars = false; + bool draw_tabs = false; + bool draw_spaces = false; - Timer *idle_detect; - - Object *tooltip_obj = nullptr; - StringName tooltip_func; - Variant tooltip_ud; - - bool next_operation_is_complex = false; - - String search_text; - uint32_t search_flags = 0; - int search_result_line = 0; - int search_result_col = 0; - - bool context_menu_enabled = true; - bool shortcut_keys_enabled = true; - bool virtual_keyboard_enabled = true; - - int get_char_pos_for_line(int p_px, int p_line, int p_wrap_index = 0) const; - int get_column_x_offset_for_line(int p_char, int p_line) const; - - Size2 get_minimum_size() const override; - int _get_control_height() const; - - int _get_menu_action_accelerator(const String &p_action); - - void _update_caches(); + /*** Super internal Core API. Everything builds on it. ***/ + bool text_changed_dirty = false; void _text_changed_emit(); - void _push_current_op(); - - /* super internal api, undo/redo builds on it */ + void _insert_text(int p_line, int p_char, const String &p_text, int *r_end_line = nullptr, int *r_end_char = nullptr); + void _remove_text(int p_from_line, int p_from_column, int p_to_line, int p_to_column); void _base_insert_text(int p_line, int p_char, const String &p_text, int &r_end_line, int &r_end_column); String _base_get_text(int p_from_line, int p_from_column, int p_to_line, int p_to_column) const; void _base_remove_text(int p_from_line, int p_from_column, int p_to_line, int p_to_column); - int _get_column_pos_of_word(const String &p_key, const String &p_search, uint32_t p_search_flags, int p_from_column); - - Dictionary _search_bind(const String &p_key, uint32_t p_search_flags, int p_from_line, int p_from_column) const; - - PopupMenu *menu = nullptr; - PopupMenu *menu_dir = nullptr; - PopupMenu *menu_ctl = nullptr; - - void _ensure_menu(); - - void _clear(); - - // Methods used in shortcuts + /* Input actions. */ void _swap_current_input_direction(); void _new_line(bool p_split_current = true, bool p_above = false); void _move_caret_left(bool p_select, bool p_move_by_word = false); @@ -459,36 +525,8 @@ private: void _move_caret_document_end(bool p_select); protected: - bool highlight_matching_braces_enabled = false; - - struct Cache { - Ref<Texture2D> tab_icon; - Ref<Texture2D> space_icon; - Ref<StyleBox> style_normal; - Ref<StyleBox> style_focus; - Ref<StyleBox> style_readonly; - Ref<Font> font; - int font_size = 16; - int outline_size = 0; - Color outline_color; - Color font_color; - Color font_readonly_color; - Color current_line_color; - Color brace_mismatch_color; - Color word_highlighted_color; - Color search_result_color; - Color search_result_border_color; - Color background_color; - - int line_spacing = 1; - } cache; - - virtual String get_tooltip(const Point2 &p_pos) const override; - - void _insert_text(int p_line, int p_char, const String &p_text, int *r_end_line = nullptr, int *r_end_char = nullptr); - void _remove_text(int p_from_line, int p_from_column, int p_to_line, int p_to_column); - virtual void _gui_input(const Ref<InputEvent> &p_gui_input); void _notification(int p_what); + virtual void _gui_input(const Ref<InputEvent> &p_gui_input); static void _bind_methods(); @@ -497,6 +535,10 @@ protected: void _get_property_list(List<PropertyInfo> *p_list) const; /* Internal API for CodeEdit, pending public API. */ + // brace matching + bool highlight_matching_braces_enabled = false; + Color brace_mismatch_color; + // Line hiding. Color code_folding_color = Color(1, 1, 1); Ref<Texture2D> folded_eol_icon; @@ -526,14 +568,78 @@ protected: virtual void _paste(); public: - /* Text manipulation */ - // User control + /* General overrides. */ + virtual Size2 get_minimum_size() const override; + virtual bool is_text_field() const override; + virtual CursorShape get_cursor_shape(const Point2 &p_pos = Point2i()) const override; + virtual String get_tooltip(const Point2 &p_pos) const override; + void set_tooltip_request_func(Object *p_obj, const StringName &p_function, const Variant &p_udata); + + /* Text */ + // Text properties. + bool has_ime_text() const; + void set_editable(const bool p_editable); bool is_editable() const; + void set_text_direction(TextDirection p_text_direction); + TextDirection get_text_direction() const; + + void set_opentype_feature(const String &p_name, int p_value); + int get_opentype_feature(const String &p_name) const; + void clear_opentype_features(); + + void set_language(const String &p_language); + String get_language() const; + + void set_structured_text_bidi_override(Control::StructuredTextParser p_parser); + Control::StructuredTextParser get_structured_text_bidi_override() const; + void set_structured_text_bidi_override_options(Array p_args); + Array get_structured_text_bidi_override_options() const; + + void set_tab_size(const int p_size); + int get_tab_size() const; + + // User controls void set_overtype_mode_enabled(const bool p_enabled); bool is_overtype_mode_enabled() const; + void set_context_menu_enabled(bool p_enable); + bool is_context_menu_enabled() const; + + void set_shortcut_keys_enabled(bool p_enabled); + bool is_shortcut_keys_enabled() const; + + void set_virtual_keyboard_enabled(bool p_enable); + bool is_virtual_keyboard_enabled() const; + + // Text manipulation + void clear(); + + void set_text(const String &p_text); + String get_text() const; + int get_line_count() const; + + void set_line(int p_line, const String &p_new_text); + String get_line(int p_line) const; + + int get_line_width(int p_line, int p_wrap_index = -1) const; + int get_line_height() const; + + int get_indent_level(int p_line) const; + int get_first_non_whitespace_column(int p_line) const; + + void swap_lines(int p_from_line, int p_to_line); + + void insert_line_at(int p_at, const String &p_text); + void insert_text_at_caret(const String &p_text); + + void remove_text(int p_from_line, int p_from_column, int p_to_line, int p_to_column); + + int get_last_unhidden_line() const; + int get_next_visible_line_offset_from(int p_line_from, int p_visible_amount) const; + Point2i get_next_visible_line_index_offset_from(int p_line_from, int p_wrap_index_from, int p_visible_amount) const; + // Overridable actions void handle_unicode_input(const uint32_t p_unicode); void backspace(); @@ -542,6 +648,42 @@ public: void copy(); void paste(); + // Context menu. + PopupMenu *get_menu() const; + bool is_menu_visible() const; + void menu_option(int p_option); + + /* Versioning */ + void begin_complex_operation(); + void end_complex_operation(); + + void undo(); + void redo(); + void clear_undo_history(); + + bool is_insert_text_operation() const; + + void tag_saved_version(); + + uint32_t get_version() const; + uint32_t get_saved_version() const; + + /* Search */ + void set_search_text(const String &p_search_text); + void set_search_flags(uint32_t p_flags); + + Point2i search(const String &p_key, uint32_t p_search_flags, int p_from_line, int p_from_column) const; + + /* Mouse */ + Point2 get_local_mouse_pos() const; + + String get_word_at_pos(const Vector2 &p_pos) const; + + Point2i get_line_column_at_pos(const Point2i &p_pos) const; + int get_minimap_line_at_pos(const Point2i &p_pos) const; + + bool is_dragging_cursor() const; + /* Caret */ void set_caret_type(CaretType p_type); CaretType get_caret_type() const; @@ -569,6 +711,8 @@ public: int get_caret_wrap_index() const; + String get_word_under_caret() const; + /* Selection. */ void set_selecting_enabled(const bool p_enabled); bool is_selecting_enabled() const; @@ -609,7 +753,7 @@ public: Vector<String> get_line_wrapped_text(int p_line) const; /* Viewport. */ - //Scrolling. + // Scrolling. void set_smooth_scroll_enabled(const bool p_enable); bool is_smooth_scroll_enabled() const; @@ -653,10 +797,6 @@ public: int get_minimap_visible_lines() const; - /* Syntax Highlighting. */ - Ref<SyntaxHighlighter> get_syntax_highlighter(); - void set_syntax_highlighter(Ref<SyntaxHighlighter> p_syntax_highlighter); - /* Gutters. */ void add_gutter(int p_at = -1); void remove_gutter(int p_gutter); @@ -692,161 +832,40 @@ public: void set_line_gutter_text(int p_line, int p_gutter, const String &p_text); String get_line_gutter_text(int p_line, int p_gutter) const; - void set_line_gutter_icon(int p_line, int p_gutter, Ref<Texture2D> p_icon); + void set_line_gutter_icon(int p_line, int p_gutter, const Ref<Texture2D> &p_icon); Ref<Texture2D> get_line_gutter_icon(int p_line, int p_gutter) const; void set_line_gutter_item_color(int p_line, int p_gutter, const Color &p_color); - Color get_line_gutter_item_color(int p_line, int p_gutter); + Color get_line_gutter_item_color(int p_line, int p_gutter) const; void set_line_gutter_clickable(int p_line, int p_gutter, bool p_clickable); bool is_line_gutter_clickable(int p_line, int p_gutter) const; // Line style void set_line_background_color(int p_line, const Color &p_color); - Color get_line_background_color(int p_line); + Color get_line_background_color(int p_line) const; - enum MenuItems { - MENU_CUT, - MENU_COPY, - MENU_PASTE, - MENU_CLEAR, - MENU_SELECT_ALL, - MENU_UNDO, - MENU_REDO, - MENU_DIR_INHERITED, - MENU_DIR_AUTO, - MENU_DIR_LTR, - MENU_DIR_RTL, - MENU_DISPLAY_UCC, - MENU_INSERT_LRM, - MENU_INSERT_RLM, - MENU_INSERT_LRE, - MENU_INSERT_RLE, - MENU_INSERT_LRO, - MENU_INSERT_RLO, - MENU_INSERT_PDF, - MENU_INSERT_ALM, - MENU_INSERT_LRI, - MENU_INSERT_RLI, - MENU_INSERT_FSI, - MENU_INSERT_PDI, - MENU_INSERT_ZWJ, - MENU_INSERT_ZWNJ, - MENU_INSERT_WJ, - MENU_INSERT_SHY, - MENU_MAX - - }; - - enum SearchFlags { - SEARCH_MATCH_CASE = 1, - SEARCH_WHOLE_WORDS = 2, - SEARCH_BACKWARDS = 4 - }; - - virtual CursorShape get_cursor_shape(const Point2 &p_pos = Point2i()) const override; - - Point2 _get_local_mouse_pos() const; - void _get_mouse_pos(const Point2i &p_mouse, int &r_row, int &r_col) const; - void _get_minimap_mouse_row(const Point2i &p_mouse, int &r_row) const; - bool is_dragging_cursor() const; - - void begin_complex_operation(); - void end_complex_operation(); - - bool is_insert_text_operation(); - - void set_text_direction(TextDirection p_text_direction); - TextDirection get_text_direction() const; - - void set_opentype_feature(const String &p_name, int p_value); - int get_opentype_feature(const String &p_name) const; - void clear_opentype_features(); - - void set_language(const String &p_language); - String get_language() const; - - void set_draw_control_chars(bool p_draw_control_chars); - bool get_draw_control_chars() const; - - void set_structured_text_bidi_override(Control::StructuredTextParser p_parser); - Control::StructuredTextParser get_structured_text_bidi_override() const; - - void set_structured_text_bidi_override_options(Array p_args); - Array get_structured_text_bidi_override_options() const; - - void set_text(String p_text); - void insert_text_at_caret(const String &p_text); - void insert_at(const String &p_text, int at); - int get_line_count() const; - int get_line_width(int p_line, int p_wrap_offset = -1) const; - - int num_lines_from(int p_line_from, int visible_amount) const; - int num_lines_from_rows(int p_line_from, int p_wrap_index_from, int visible_amount, int &wrap_index) const; - int get_last_unhidden_line() const; - - String get_text(); - String get_line(int line) const; - bool has_ime_text() const; - void set_line(int line, String new_text); - int get_row_height() const; - - int get_indent_level(int p_line) const; - int get_first_non_whitespace_column(int p_line) const; - - void clear(); - - void swap_lines(int line1, int line2); + /* Syntax Highlighting. */ + void set_syntax_highlighter(Ref<SyntaxHighlighter> p_syntax_highlighter); + Ref<SyntaxHighlighter> get_syntax_highlighter() const; - void set_search_text(const String &p_search_text); - void set_search_flags(uint32_t p_flags); - void set_current_search_result(int line, int col); + /* Visual. */ + void set_highlight_current_line(bool p_enabled); + bool is_highlight_current_line_enabled() const; void set_highlight_all_occurrences(const bool p_enabled); bool is_highlight_all_occurrences_enabled() const; - String get_word_under_caret() const; - String get_word_at_pos(const Vector2 &p_pos) const; - - bool search(const String &p_key, uint32_t p_search_flags, int p_from_line, int p_from_column, int &r_line, int &r_column) const; - - void undo(); - void redo(); - void clear_undo_history(); + void set_draw_control_chars(bool p_draw_control_chars); + bool get_draw_control_chars() const; - void set_tab_size(const int p_size); - int get_tab_size() const; void set_draw_tabs(bool p_draw); bool is_drawing_tabs() const; + void set_draw_spaces(bool p_draw); bool is_drawing_spaces() const; - uint32_t get_version() const; - uint32_t get_saved_version() const; - void tag_saved_version(); - - void menu_option(int p_option); - - void set_highlight_current_line(bool p_enabled); - bool is_highlight_current_line_enabled() const; - - void set_tooltip_request_func(Object *p_obj, const StringName &p_function, const Variant &p_udata); - - void set_context_menu_enabled(bool p_enable); - bool is_context_menu_enabled(); - - void set_shortcut_keys_enabled(bool p_enabled); - bool is_shortcut_keys_enabled() const; - - void set_virtual_keyboard_enabled(bool p_enable); - bool is_virtual_keyboard_enabled() const; - - bool is_menu_visible() const; - PopupMenu *get_menu() const; - - virtual bool is_text_field() const override; TextEdit(); - ~TextEdit(); }; VARIANT_ENUM_CAST(TextEdit::CaretType); |