diff options
Diffstat (limited to 'scene/gui/text_edit.h')
-rw-r--r-- | scene/gui/text_edit.h | 942 |
1 files changed, 523 insertions, 419 deletions
diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h index 9e6dedb267..da322a7bcd 100644 --- a/scene/gui/text_edit.h +++ b/scene/gui/text_edit.h @@ -42,12 +42,13 @@ class TextEdit : public Control { GDCLASS(TextEdit, Control); public: - enum GutterType { - GUTTER_TYPE_STRING, - GUTTER_TYPE_ICON, - GUTTER_TYPE_CUSTOM + /* Caret. */ + enum CaretType { + CARET_TYPE_LINE, + CARET_TYPE_BLOCK }; + /* Selection */ enum SelectionMode { SELECTION_MODE_NONE, SELECTION_MODE_SHIFT, @@ -56,6 +57,60 @@ public: SELECTION_MODE_LINE }; + /* Line Wrapping.*/ + enum LineWrappingMode { + LINE_WRAPPING_NONE, + LINE_WRAPPING_BOUNDARY + }; + + /* Gutters. */ + enum GutterType { + GUTTER_TYPE_STRING, + GUTTER_TYPE_ICON, + 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; @@ -68,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: @@ -101,6 +151,8 @@ private: }; private: + bool is_dirty = false; + mutable Vector<Line> text; Ref<Font> font; int font_size = -1; @@ -121,7 +173,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; @@ -159,7 +211,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; } @@ -173,38 +225,48 @@ private: const Color get_line_background_color(int p_line) const { return text[p_line].background_color; } }; - struct Cursor { - Point2 draw_pos; - bool visible = false; - int last_fit_x = 0; - int line = 0; - int column = 0; ///< cursor - int x_ofs = 0; - int line_ofs = 0; - int wrap_ofs = 0; - } cursor; + /* Text */ + Text text; - struct Selection { - SelectionMode selecting_mode = SelectionMode::SELECTION_MODE_NONE; - int selecting_line = 0; - int selecting_column = 0; - int selected_word_beg = 0; - int selected_word_end = 0; - int selected_word_origin = 0; - bool selecting_text = false; + bool setting_text = false; - bool active = false; + // Text properties. + String ime_text = ""; + Point2 ime_selection; - int from_line = 0; - int from_column = 0; - int to_line = 0; - int to_column = 0; + /* Initialise to opposite first, so we get past the early-out in set_editable. */ + bool editable = false; - bool shiftclick_left = false; - } selection; + TextDirection text_direction = TEXT_DIRECTION_AUTO; + TextDirection input_direction = TEXT_DIRECTION_LTR; - Map<int, Dictionary> syntax_highlighting_cache; + 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, @@ -224,247 +286,249 @@ private: bool chain_backward = false; }; - String ime_text; - Point2 ime_selection; + bool undo_enabled = true; + int undo_stack_max_size = 50; - TextOperation current_op; + bool next_operation_is_complex = false; + TextOperation current_op; List<TextOperation> undo_stack; List<TextOperation>::Element *undo_stack_pos = nullptr; - int undo_stack_max_size; - void _clear_redo(); + 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(); - //syntax coloring - Ref<SyntaxHighlighter> syntax_highlighter; - Set<String> keywords; + /* Search */ + Color search_result_color = Color(1, 1, 1); + Color search_result_border_color = Color(1, 1, 1); - Dictionary _get_line_syntax_highlighting(int p_line); + String search_text = ""; + uint32_t search_flags = 0; - bool setting_text = false; + int _get_column_pos_of_word(const String &p_key, const String &p_search, uint32_t p_search_flags, int p_from_column) const; - // data - Text text; + /* Tooltip. */ + Object *tooltip_obj = nullptr; + StringName tooltip_func; + Variant tooltip_ud; - 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; + /* Mouse */ + int _get_char_pos_for_line(int p_px, int p_line, int p_wrap_index = 0) const; - uint32_t version = 0; - uint32_t saved_version = 0; + /* Caret. */ + struct Caret { + Point2 draw_pos; + bool visible = false; + int last_fit_x = 0; + int line = 0; + int column = 0; + int x_ofs = 0; + int line_ofs = 0; + int wrap_ofs = 0; + } caret; - bool readonly = true; // Initialise to opposite first, so we get past the early-out in set_readonly. + bool setting_caret_line = false; + bool caret_pos_dirty = false; + + Color caret_color = Color(1, 1, 1); + Color caret_background_color = Color(0, 0, 0); + + CaretType caret_type = CaretType::CARET_TYPE_LINE; - Timer *caret_blink_timer; - bool caret_blink_enabled = false; bool draw_caret = true; - bool window_has_focus = true; - bool block_caret = false; - bool right_click_moves_caret = true; - bool mid_grapheme_caret_enabled = false; - bool wrap_enabled = false; - int wrap_at = 0; - int wrap_right_offset = 10; + bool caret_blink_enabled = false; + Timer *caret_blink_timer; - bool first_draw = true; - bool setting_row = false; - bool draw_tabs = false; - bool draw_spaces = false; - bool override_selected_font_color = false; - bool cursor_changed_dirty = false; - bool text_changed_dirty = false; - bool undo_enabled = true; - bool hiding_enabled = false; - bool draw_minimap = false; - int minimap_width = 80; - Point2 minimap_char_size = Point2(1, 2); - int minimap_line_spacing = 1; + bool move_caret_on_right_click = true; - bool highlight_all_occurrences = false; - bool scroll_past_end_of_file_enabled = false; - bool highlight_current_line = false; + bool caret_mid_grapheme_enabled = false; - String cut_copy_line; - bool insert_mode = false; - bool select_identifiers_enabled = false; + void _emit_caret_changed(); - bool smooth_scroll_enabled = false; - bool scrolling = false; - bool dragging_selection = false; - bool dragging_minimap = false; - bool can_drag_minimap = false; - bool minimap_clicked = false; - double minimap_scroll_ratio = 0.0; - double minimap_scroll_click_pos = 0.0; - float target_v_scroll = 0.0; - float v_scroll_speed = 80.0; + void _reset_caret_blink_timer(); + void _toggle_draw_caret(); - String lookup_symbol_word; + int _get_column_x_offset_for_line(int p_char, int p_line) const; - uint64_t last_dblclk = 0; + /* Selection. */ + struct Selection { + SelectionMode selecting_mode = SelectionMode::SELECTION_MODE_NONE; + int selecting_line = 0; + int selecting_column = 0; + int selected_word_beg = 0; + int selected_word_end = 0; + int selected_word_origin = 0; + bool selecting_text = false; + + bool active = false; + + int from_line = 0; + int from_column = 0; + int to_line = 0; + int to_column = 0; + + bool shiftclick_left = false; + } selection; + + bool selecting_enabled = true; + + Color font_selected_color = Color(1, 1, 1); + Color selection_color = Color(1, 1, 1); + bool override_selected_font_color = false; + + bool dragging_selection = false; - Timer *idle_detect; Timer *click_select_held; - HScrollBar *h_scroll; - VScrollBar *v_scroll; - bool updating_scrolls = false; + uint64_t last_dblclk = 0; + Vector2 last_dblclk_pos; + void _click_selection_held(); - Object *tooltip_obj = nullptr; - StringName tooltip_func; - Variant tooltip_ud; + void _update_selection_mode_pointer(); + void _update_selection_mode_word(); + void _update_selection_mode_line(); - bool next_operation_is_complex = false; + void _pre_shift_selection(); + void _post_shift_selection(); - String search_text; - uint32_t search_flags = 0; - int search_result_line = 0; - int search_result_col = 0; + /* line wrapping. */ + LineWrappingMode line_wrapping_mode = LineWrappingMode::LINE_WRAPPING_NONE; - bool selecting_enabled = true; + int wrap_at_column = 0; + int wrap_right_offset = 10; - bool context_menu_enabled = true; - bool shortcut_keys_enabled = true; - bool virtual_keyboard_enabled = true; + void _update_wrap_at_column(bool p_force = false); - int get_visible_rows() const; - int get_total_visible_rows() const; + void _update_caret_wrap_offset(); - int _get_minimap_visible_rows() const; + /* Viewport. */ + HScrollBar *h_scroll; + VScrollBar *v_scroll; - void update_cursor_wrap_offset(); - void _update_wrap_at(bool p_force = false); - Vector<String> get_wrap_rows_text(int p_line) const; - int get_cursor_wrap_index() const; - int get_char_count(); + bool scroll_past_end_of_file_enabled = false; - double get_scroll_pos_for_line(int p_line, int p_wrap_index = 0) const; - void set_line_as_first_visible(int p_line, int p_wrap_index = 0); - void set_line_as_center_visible(int p_line, int p_wrap_index = 0); - void set_line_as_last_visible(int p_line, int p_wrap_index = 0); - int get_first_visible_line() const; - int get_last_full_visible_line() const; - int get_last_full_visible_line_wrap_index() const; - double get_visible_rows_offset() const; - double get_v_scroll_offset() const; + // Smooth scrolling. + bool smooth_scroll_enabled = false; + float target_v_scroll = 0.0; + float v_scroll_speed = 80.0; - 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; + // Scrolling. + bool scrolling = false; + bool updating_scrolls = false; - void adjust_viewport_to_cursor(); - double get_scroll_line_diff() const; - void _scroll_moved(double); void _update_scrollbars(); + int _get_control_height() const; + void _v_scroll_input(); - void _click_selection_held(); + void _scroll_moved(double p_to_val); - void _update_selection_mode_pointer(); - void _update_selection_mode_word(); - void _update_selection_mode_line(); + double _get_visible_lines_offset() const; + double _get_v_scroll_offset() const; - void _update_minimap_click(); - void _update_minimap_drag(); void _scroll_up(real_t p_delta); void _scroll_down(real_t p_delta); - void _pre_shift_selection(); - void _post_shift_selection(); - void _scroll_lines_up(); void _scroll_lines_down(); - //void mouse_motion(const Point& p_pos, const Point& p_rel, int p_button_mask); - Size2 get_minimum_size() const override; - int _get_control_height() const; + // Minimap + bool draw_minimap = false; - int _get_menu_action_accelerator(const String &p_action); + int minimap_width = 80; + Point2 minimap_char_size = Point2(1, 2); + int minimap_line_spacing = 1; - void _reset_caret_blink_timer(); - void _toggle_draw_caret(); + // minimap scroll + bool minimap_clicked = false; + bool dragging_minimap = false; + bool can_drag_minimap = false; - void _update_caches(); - void _cursor_changed_emit(); - void _text_changed_emit(); + double minimap_scroll_ratio = 0.0; + double minimap_scroll_click_pos = 0.0; - void _push_current_op(); + void _update_minimap_click(); + void _update_minimap_drag(); - /* super internal api, undo/redo builds on it */ + /* Gutters. */ + Vector<GutterInfo> gutters; + int gutters_width = 0; + int gutter_padding = 0; - 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); + void _update_gutter_width(); - int _get_column_pos_of_word(const String &p_key, const String &p_search, uint32_t p_search_flags, int p_from_column); + /* Syntax highlighting. */ + Ref<SyntaxHighlighter> syntax_highlighter; + Map<int, Dictionary> syntax_highlighting_cache; - Dictionary _search_bind(const String &p_key, uint32_t p_search_flags, int p_from_line, int p_from_column) const; + Dictionary _get_line_syntax_highlighting(int p_line); - PopupMenu *menu = nullptr; - PopupMenu *menu_dir = nullptr; - PopupMenu *menu_ctl = nullptr; + /* Visual. */ + Ref<StyleBox> style_normal; + Ref<StyleBox> style_focus; + Ref<StyleBox> style_readonly; - void _ensure_menu(); + Ref<Texture2D> tab_icon; + Ref<Texture2D> space_icon; - void _clear(); + Ref<Font> font; + int font_size = 16; + Color font_color = Color(1, 1, 1); + Color font_readonly_color = Color(1, 1, 1); - // Methods used in shortcuts - void _swap_current_input_direction(); - void _new_line(bool p_split_current = true, bool p_above = false); - void _move_cursor_left(bool p_select, bool p_move_by_word = false); - void _move_cursor_right(bool p_select, bool p_move_by_word = false); - void _move_cursor_up(bool p_select); - void _move_cursor_down(bool p_select); - void _move_cursor_to_line_start(bool p_select); - void _move_cursor_to_line_end(bool p_select); - void _move_cursor_page_up(bool p_select); - void _move_cursor_page_down(bool p_select); - void _do_backspace(bool p_word = false, bool p_all_to_left = false); - void _delete(bool p_word = false, bool p_all_to_right = false); - void _move_cursor_document_start(bool p_select); - void _move_cursor_document_end(bool p_select); + int outline_size = 0; + Color outline_color = Color(1, 1, 1); -protected: - bool highlight_matching_braces_enabled = false; + int line_spacing = 1; - struct Cache { - Ref<Texture2D> tab_icon; - Ref<Texture2D> space_icon; - Ref<Texture2D> folded_eol_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 caret_color; - Color caret_background_color; - Color font_color; - Color font_selected_color; - Color font_readonly_color; - Color selection_color; - Color code_folding_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; - int minimap_width = 0; - } cache; + Color background_color = Color(1, 1, 1); + Color current_line_color = Color(1, 1, 1); + Color word_highlighted_color = Color(1, 1, 1); - virtual String get_tooltip(const Point2 &p_pos) const override; + bool window_has_focus = true; + bool first_draw = true; + + bool highlight_current_line = false; + bool highlight_all_occurrences = false; + bool draw_control_chars = false; + bool draw_tabs = false; + bool draw_spaces = false; + + /*** Super internal Core API. Everything builds on it. ***/ + bool text_changed_dirty = false; + void _text_changed_emit(); 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 _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); + + /* 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); + void _move_caret_right(bool p_select, bool p_move_by_word = false); + void _move_caret_up(bool p_select); + void _move_caret_down(bool p_select); + void _move_caret_to_line_start(bool p_select); + void _move_caret_to_line_end(bool p_select); + void _move_caret_page_up(bool p_select); + void _move_caret_page_down(bool p_select); + void _do_backspace(bool p_word = false, bool p_all_to_left = false); + void _delete(bool p_word = false, bool p_all_to_right = false); + void _move_caret_document_start(bool p_select); + void _move_caret_document_end(bool p_select); + +protected: void _notification(int p_what); + virtual void _gui_input(const Ref<InputEvent> &p_gui_input); static void _bind_methods(); @@ -472,304 +536,344 @@ protected: bool _get(const StringName &p_name, Variant &r_ret) const; 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; + + bool hiding_enabled = false; + + void _set_hiding_enabled(bool p_enabled); + bool _is_hiding_enabled() const; + + void _set_line_as_hidden(int p_line, bool p_hidden); + bool _is_line_hidden(int p_line) const; + + void _unhide_all_lines(); + + // Symbol lookup. + String lookup_symbol_word; void _set_symbol_lookup_word(const String &p_symbol); + /* Text manipulation */ + + // Overridable actions + virtual void _handle_unicode_input(const uint32_t p_unicode); + virtual void _backspace(); + + virtual void _cut(); + virtual void _copy(); + virtual void _paste(); + public: - /* Syntax Highlighting. */ - Ref<SyntaxHighlighter> get_syntax_highlighter(); - void set_syntax_highlighter(Ref<SyntaxHighlighter> p_syntax_highlighter); + /* 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); - /* Gutters. */ - void add_gutter(int p_at = -1); - void remove_gutter(int p_gutter); - int get_gutter_count() const; + /* Text */ + // Text properties. + bool has_ime_text() const; - void set_gutter_name(int p_gutter, const String &p_name); - String get_gutter_name(int p_gutter) const; + void set_editable(const bool p_editable); + bool is_editable() const; - void set_gutter_type(int p_gutter, GutterType p_type); - GutterType get_gutter_type(int p_gutter) const; + void set_text_direction(TextDirection p_text_direction); + TextDirection get_text_direction() const; - void set_gutter_width(int p_gutter, int p_width); - int get_gutter_width(int p_gutter) const; - int get_total_gutter_width() 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_gutter_draw(int p_gutter, bool p_draw); - bool is_gutter_drawn(int p_gutter) const; + void set_language(const String &p_language); + String get_language() const; - void set_gutter_clickable(int p_gutter, bool p_clickable); - bool is_gutter_clickable(int p_gutter) 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_gutter_overwritable(int p_gutter, bool p_overwritable); - bool is_gutter_overwritable(int p_gutter) const; + void set_tab_size(const int p_size); + int get_tab_size() const; - void merge_gutters(int p_from_line, int p_to_line); + // User controls + void set_overtype_mode_enabled(const bool p_enabled); + bool is_overtype_mode_enabled() const; - void set_gutter_custom_draw(int p_gutter, Object *p_object, const StringName &p_callback); + void set_context_menu_enabled(bool p_enable); + bool is_context_menu_enabled() const; - // Line gutters. - void set_line_gutter_metadata(int p_line, int p_gutter, const Variant &p_metadata); - Variant get_line_gutter_metadata(int p_line, int p_gutter) const; + void set_shortcut_keys_enabled(bool p_enabled); + bool is_shortcut_keys_enabled() const; - 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_virtual_keyboard_enabled(bool p_enable); + bool is_virtual_keyboard_enabled() const; - void set_line_gutter_icon(int p_line, int p_gutter, Ref<Texture2D> p_icon); - Ref<Texture2D> get_line_gutter_icon(int p_line, int p_gutter) const; + // Text manipulation + void clear(); - 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); + void set_text(const String &p_text); + String get_text() const; + int get_line_count() 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; + void set_line(int p_line, const String &p_new_text); + String get_line(int p_line) const; - // Line style - void set_line_background_color(int p_line, const Color &p_color); - Color get_line_background_color(int p_line); + int get_line_width(int p_line, int p_wrap_index = -1) const; + int get_line_height() 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 + 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); - enum SearchFlags { - SEARCH_MATCH_CASE = 1, - SEARCH_WHOLE_WORDS = 2, - SEARCH_BACKWARDS = 4 - }; + void insert_line_at(int p_at, const String &p_text); + void insert_text_at_caret(const String &p_text); - virtual CursorShape get_cursor_shape(const Point2 &p_pos = Point2i()) const override; + void remove_text(int p_from_line, int p_from_column, int p_to_line, int p_to_column); - 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; + 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; - //void delete_char(); - //void delete_line(); + // Overridable actions + void handle_unicode_input(const uint32_t p_unicode); + void backspace(); + void cut(); + 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(); - bool is_insert_text_operation(); - - void set_text_direction(TextDirection p_text_direction); - TextDirection get_text_direction() const; + void undo(); + void redo(); + void clear_undo_history(); - void set_opentype_feature(const String &p_name, int p_value); - int get_opentype_feature(const String &p_name) const; - void clear_opentype_features(); + bool is_insert_text_operation() const; - void set_language(const String &p_language); - String get_language() const; + void tag_saved_version(); - void set_draw_control_chars(bool p_draw_control_chars); - bool get_draw_control_chars() const; + uint32_t get_version() const; + uint32_t get_saved_version() const; - void set_structured_text_bidi_override(Control::StructuredTextParser p_parser); - Control::StructuredTextParser get_structured_text_bidi_override() const; + /* Search */ + void set_search_text(const String &p_search_text); + void set_search_flags(uint32_t p_flags); - void set_structured_text_bidi_override_options(Array p_args); - Array get_structured_text_bidi_override_options() const; + Point2i search(const String &p_key, uint32_t p_search_flags, int p_from_line, int p_from_column) const; - void set_text(String p_text); - void insert_text_at_cursor(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 get_line_wrap_index_at_col(int p_line, int p_column) const; - - void set_line_as_hidden(int p_line, bool p_hidden); - bool is_line_hidden(int p_line) const; - void unhide_all_lines(); - 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; + /* Mouse */ + Point2 get_local_mouse_pos() 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; + String get_word_at_pos(const Vector2 &p_pos) const; - int get_indent_level(int p_line) const; - int get_first_non_whitespace_column(int p_line) const; + Point2i get_line_column_at_pos(const Point2i &p_pos) const; + int get_minimap_line_at_pos(const Point2i &p_pos) const; - inline void set_scroll_pass_end_of_file(bool p_enabled) { - scroll_past_end_of_file_enabled = p_enabled; - update(); - } + bool is_dragging_cursor() const; - void center_viewport_to_cursor(); + /* Caret */ + void set_caret_type(CaretType p_type); + CaretType get_caret_type() const; - void set_mid_grapheme_caret_enabled(const bool p_enabled); - bool get_mid_grapheme_caret_enabled() const; + void set_caret_blink_enabled(const bool p_enabled); + bool is_caret_blink_enabled() const; - void cursor_set_column(int p_col, bool p_adjust_viewport = true); - void cursor_set_line(int p_row, bool p_adjust_viewport = true, bool p_can_be_hidden = true, int p_wrap_index = 0); + void set_caret_blink_speed(const float p_speed); + float get_caret_blink_speed() const; - Point2 get_caret_draw_pos() const; - bool is_caret_visible() const; - int cursor_get_column() const; - int cursor_get_line() const; - Vector2i _get_cursor_pixel_pos(bool p_adjust_viewport = true); + void set_move_caret_on_right_click_enabled(const bool p_enable); + bool is_move_caret_on_right_click_enabled() const; - bool cursor_get_blink_enabled() const; - void cursor_set_blink_enabled(const bool p_enabled); + void set_caret_mid_grapheme_enabled(const bool p_enabled); + bool is_caret_mid_grapheme_enabled() const; - float cursor_get_blink_speed() const; - void cursor_set_blink_speed(const float p_speed); + bool is_caret_visible() const; + Point2 get_caret_draw_pos() const; - void cursor_set_block_mode(const bool p_enable); - bool cursor_is_block_mode() const; + void set_caret_line(int p_line, bool p_adjust_viewport = true, bool p_can_be_hidden = true, int p_wrap_index = 0); + int get_caret_line() const; - void set_right_click_moves_caret(bool p_enable); - bool is_right_click_moving_caret() const; + void set_caret_column(int p_col, bool p_adjust_viewport = true); + int get_caret_column() const; - SelectionMode get_selection_mode() const; - void set_selection_mode(SelectionMode p_mode, int p_line = -1, int p_column = -1); - int get_selection_line() const; - int get_selection_column() const; + int get_caret_wrap_index() const; - void set_readonly(bool p_readonly); - bool is_readonly() const; + String get_word_under_caret() const; - void set_wrap_enabled(bool p_wrap_enabled); - bool is_wrap_enabled() const; - bool line_wraps(int line) const; - int times_line_wraps(int line) const; + /* Selection. */ + void set_selecting_enabled(const bool p_enabled); + bool is_selecting_enabled() const; - void clear(); + void set_override_selected_font_color(bool p_override_selected_font_color); + bool is_overriding_selected_font_color() const; - void delete_selection(); + void set_selection_mode(SelectionMode p_mode, int p_line = -1, int p_column = -1); + SelectionMode get_selection_mode() const; - virtual void handle_unicode_input(uint32_t p_unicode); - virtual void backspace(); - void cut(); - void copy(); - void paste(); void select_all(); void select_word_under_caret(); void select(int p_from_line, int p_from_column, int p_to_line, int p_to_column); - void deselect(); - void swap_lines(int line1, int line2); - 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); + bool has_selection() const; + + String get_selected_text() const; + + int get_selection_line() const; + int get_selection_column() const; - void set_highlight_all_occurrences(const bool p_enabled); - bool is_highlight_all_occurrences_enabled() const; - bool is_selection_active() const; int get_selection_from_line() const; int get_selection_from_column() const; int get_selection_to_line() const; int get_selection_to_column() const; - String get_selection_text() const; - String get_word_under_cursor() const; - String get_word_at_pos(const Vector2 &p_pos) const; + void deselect(); + void delete_selection(); - 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; + /* line wrapping. */ + void set_line_wrapping_mode(LineWrappingMode p_wrapping_mode); + LineWrappingMode get_line_wrapping_mode() const; - void undo(); - void redo(); - void clear_undo_history(); + bool is_line_wrapped(int p_line) const; + int get_line_wrap_count(int p_line) const; + int get_line_wrap_index_at_column(int p_line, int p_column) 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; - void set_override_selected_font_color(bool p_override_selected_font_color); - bool is_overriding_selected_font_color() const; + Vector<String> get_line_wrapped_text(int p_line) const; - void set_insert_mode(bool p_enabled); - bool is_insert_mode() const; + /* Viewport. */ + // Scrolling. + void set_smooth_scroll_enabled(const bool p_enable); + bool is_smooth_scroll_enabled() const; + + void set_scroll_past_end_of_file_enabled(const bool p_enabled); + bool is_scroll_past_end_of_file_enabled() const; - double get_v_scroll() const; void set_v_scroll(double p_scroll); + double get_v_scroll() const; - int get_h_scroll() const; void set_h_scroll(int p_scroll); - - void set_smooth_scroll_enabled(bool p_enable); - bool is_smooth_scroll_enabled() const; + int get_h_scroll() const; void set_v_scroll_speed(float p_speed); float get_v_scroll_speed() const; - uint32_t get_version() const; - uint32_t get_saved_version() const; - void tag_saved_version(); + double get_scroll_pos_for_line(int p_line, int p_wrap_index = 0) const; - void menu_option(int p_option); + // Visible lines. + void set_line_as_first_visible(int p_line, int p_wrap_index = 0); + int get_first_visible_line() const; - void set_highlight_current_line(bool p_enabled); - bool is_highlight_current_line_enabled() const; + void set_line_as_center_visible(int p_line, int p_wrap_index = 0); + + void set_line_as_last_visible(int p_line, int p_wrap_index = 0); + int get_last_full_visible_line() const; + int get_last_full_visible_line_wrap_index() const; + + int get_visible_line_count() const; + int get_total_visible_line_count() const; + + // Auto Adjust + void adjust_viewport_to_caret(); + void center_viewport_to_caret(); + // Minimap void set_draw_minimap(bool p_draw); bool is_drawing_minimap() const; void set_minimap_width(int p_minimap_width); int get_minimap_width() const; - void set_hiding_enabled(bool p_enabled); - bool is_hiding_enabled() const; + int get_minimap_visible_lines() const; - void set_tooltip_request_func(Object *p_obj, const StringName &p_function, const Variant &p_udata); + /* Gutters. */ + void add_gutter(int p_at = -1); + void remove_gutter(int p_gutter); + int get_gutter_count() const; - void set_context_menu_enabled(bool p_enable); - bool is_context_menu_enabled(); + void set_gutter_name(int p_gutter, const String &p_name); + String get_gutter_name(int p_gutter) const; - void set_selecting_enabled(bool p_enabled); - bool is_selecting_enabled() const; + void set_gutter_type(int p_gutter, GutterType p_type); + GutterType get_gutter_type(int p_gutter) const; - void set_shortcut_keys_enabled(bool p_enabled); - bool is_shortcut_keys_enabled() const; + void set_gutter_width(int p_gutter, int p_width); + int get_gutter_width(int p_gutter) const; + int get_total_gutter_width() const; - void set_virtual_keyboard_enabled(bool p_enable); - bool is_virtual_keyboard_enabled() const; + void set_gutter_draw(int p_gutter, bool p_draw); + bool is_gutter_drawn(int p_gutter) const; - bool is_menu_visible() const; - PopupMenu *get_menu() const; + void set_gutter_clickable(int p_gutter, bool p_clickable); + bool is_gutter_clickable(int p_gutter) const; + + void set_gutter_overwritable(int p_gutter, bool p_overwritable); + bool is_gutter_overwritable(int p_gutter) const; + + void merge_gutters(int p_from_line, int p_to_line); + + void set_gutter_custom_draw(int p_gutter, Object *p_object, const StringName &p_callback); + + // Line gutters. + void set_line_gutter_metadata(int p_line, int p_gutter, const Variant &p_metadata); + Variant get_line_gutter_metadata(int p_line, int p_gutter) const; + + 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, 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) 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) const; + + /* Syntax Highlighting. */ + void set_syntax_highlighter(Ref<SyntaxHighlighter> p_syntax_highlighter); + Ref<SyntaxHighlighter> get_syntax_highlighter() const; + + /* 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; + + void set_draw_control_chars(bool p_draw_control_chars); + bool get_draw_control_chars() 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; - virtual bool is_text_field() const override; TextEdit(); - ~TextEdit(); }; -VARIANT_ENUM_CAST(TextEdit::GutterType); +VARIANT_ENUM_CAST(TextEdit::CaretType); +VARIANT_ENUM_CAST(TextEdit::LineWrappingMode); VARIANT_ENUM_CAST(TextEdit::SelectionMode); +VARIANT_ENUM_CAST(TextEdit::GutterType); VARIANT_ENUM_CAST(TextEdit::MenuItems); VARIANT_ENUM_CAST(TextEdit::SearchFlags); |