Browse Source

TextEdit word wrap

Ian 7 years ago
parent
commit
e1fff4bc09
4 changed files with 451 additions and 347 deletions
  1. 1 0
      editor/code_editor.cpp
  2. 1 0
      editor/editor_settings.cpp
  3. 407 330
      scene/gui/text_edit.cpp
  4. 42 17
      scene/gui/text_edit.h

+ 1 - 0
editor/code_editor.cpp

@@ -779,6 +779,7 @@ void CodeTextEditor::update_editor_settings() {
 	text_editor->set_draw_breakpoint_gutter(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_breakpoint_gutter"));
 	text_editor->set_draw_breakpoint_gutter(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_breakpoint_gutter"));
 	text_editor->set_hiding_enabled(EditorSettings::get_singleton()->get("text_editor/line_numbers/code_folding"));
 	text_editor->set_hiding_enabled(EditorSettings::get_singleton()->get("text_editor/line_numbers/code_folding"));
 	text_editor->set_draw_fold_gutter(EditorSettings::get_singleton()->get("text_editor/line_numbers/code_folding"));
 	text_editor->set_draw_fold_gutter(EditorSettings::get_singleton()->get("text_editor/line_numbers/code_folding"));
+	text_editor->set_wrap_enabled(EditorSettings::get_singleton()->get("text_editor/line_numbers/word_wrap"));
 	text_editor->cursor_set_block_mode(EditorSettings::get_singleton()->get("text_editor/cursor/block_caret"));
 	text_editor->cursor_set_block_mode(EditorSettings::get_singleton()->get("text_editor/cursor/block_caret"));
 	text_editor->set_smooth_scroll_enabled(EditorSettings::get_singleton()->get("text_editor/open_scripts/smooth_scrolling"));
 	text_editor->set_smooth_scroll_enabled(EditorSettings::get_singleton()->get("text_editor/open_scripts/smooth_scrolling"));
 	text_editor->set_v_scroll_speed(EditorSettings::get_singleton()->get("text_editor/open_scripts/v_scroll_speed"));
 	text_editor->set_v_scroll_speed(EditorSettings::get_singleton()->get("text_editor/open_scripts/v_scroll_speed"));

+ 1 - 0
editor/editor_settings.cpp

@@ -371,6 +371,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
 	_initial_set("text_editor/line_numbers/line_numbers_zero_padded", false);
 	_initial_set("text_editor/line_numbers/line_numbers_zero_padded", false);
 	_initial_set("text_editor/line_numbers/show_breakpoint_gutter", true);
 	_initial_set("text_editor/line_numbers/show_breakpoint_gutter", true);
 	_initial_set("text_editor/line_numbers/code_folding", true);
 	_initial_set("text_editor/line_numbers/code_folding", true);
+	_initial_set("text_editor/line_numbers/word_wrap", false);
 	_initial_set("text_editor/line_numbers/show_line_length_guideline", false);
 	_initial_set("text_editor/line_numbers/show_line_length_guideline", false);
 	_initial_set("text_editor/line_numbers/line_length_guideline_column", 80);
 	_initial_set("text_editor/line_numbers/line_length_guideline_column", 80);
 	hints["text_editor/line_numbers/line_length_guideline_column"] = PropertyInfo(Variant::INT, "text_editor/line_numbers/line_length_guideline_column", PROPERTY_HINT_RANGE, "20, 160, 1");
 	hints["text_editor/line_numbers/line_length_guideline_column"] = PropertyInfo(Variant::INT, "text_editor/line_numbers/line_length_guideline_column", PROPERTY_HINT_RANGE, "20, 160, 1");

File diff suppressed because it is too large
+ 407 - 330
scene/gui/text_edit.cpp


+ 42 - 17
scene/gui/text_edit.h

@@ -76,6 +76,7 @@ public:
 			bool marked : 1;
 			bool marked : 1;
 			bool breakpoint : 1;
 			bool breakpoint : 1;
 			bool hidden : 1;
 			bool hidden : 1;
+			int wrap_amount_cache : 24;
 			Map<int, ColorRegionInfo> region_info;
 			Map<int, ColorRegionInfo> region_info;
 			String data;
 			String data;
 		};
 		};
@@ -94,6 +95,9 @@ public:
 		void set_color_regions(const Vector<ColorRegion> *p_regions) { color_regions = p_regions; }
 		void set_color_regions(const Vector<ColorRegion> *p_regions) { color_regions = p_regions; }
 		int get_line_width(int p_line) const;
 		int get_line_width(int p_line) const;
 		int get_max_width(bool p_exclude_hidden = false) const;
 		int get_max_width(bool p_exclude_hidden = false) const;
+		int get_char_width(char c, char next_c, int px) const;
+		void set_line_wrap_amount(int p_line, int p_wrap_amount) const;
+		int get_line_wrap_amount(int p_line) const;
 		const Map<int, ColorRegionInfo> &get_color_region_info(int p_line) const;
 		const Map<int, ColorRegionInfo> &get_color_region_info(int p_line) const;
 		void set(int p_line, const String &p_text);
 		void set(int p_line, const String &p_text);
 		void set_marked(int p_line, bool p_marked) { text[p_line].marked = p_marked; }
 		void set_marked(int p_line, bool p_marked) { text[p_line].marked = p_marked; }
@@ -106,7 +110,8 @@ public:
 		void remove(int p_at);
 		void remove(int p_at);
 		int size() const { return text.size(); }
 		int size() const { return text.size(); }
 		void clear();
 		void clear();
-		void clear_caches();
+		void clear_width_cache();
+		void clear_wrap_cache();
 		_FORCE_INLINE_ const String &operator[](int p_line) const { return text[p_line].data; }
 		_FORCE_INLINE_ const String &operator[](int p_line) const { return text[p_line].data; }
 		Text() { indent_size = 4; }
 		Text() { indent_size = 4; }
 	};
 	};
@@ -115,7 +120,7 @@ private:
 	struct Cursor {
 	struct Cursor {
 		int last_fit_x;
 		int last_fit_x;
 		int line, column; ///< cursor
 		int line, column; ///< cursor
-		int x_ofs, line_ofs;
+		int x_ofs, line_ofs, wrap_ofs;
 	} cursor;
 	} cursor;
 
 
 	struct Selection {
 	struct Selection {
@@ -263,8 +268,11 @@ private:
 	bool block_caret;
 	bool block_caret;
 	bool right_click_moves_caret;
 	bool right_click_moves_caret;
 
 
+	bool wrap_enabled;
+	int wrap_at;
+	int wrap_right_offset;
+
 	bool setting_row;
 	bool setting_row;
-	bool wrap;
 	bool draw_tabs;
 	bool draw_tabs;
 	bool override_selected_font_color;
 	bool override_selected_font_color;
 	bool cursor_changed_dirty;
 	bool cursor_changed_dirty;
@@ -321,19 +329,34 @@ private:
 	int search_result_line;
 	int search_result_line;
 	int search_result_col;
 	int search_result_col;
 
 
-	double line_scroll_pos;
-
 	bool context_menu_enabled;
 	bool context_menu_enabled;
 
 
 	int get_visible_rows() const;
 	int get_visible_rows() const;
-	int get_total_unhidden_rows() const;
-	double get_line_scroll_pos(bool p_recalculate = false) const;
-	void update_line_scroll_pos();
-
+	int get_total_visible_rows() const;
+
+	void update_cursor_wrap_offset();
+	void update_wrap_at();
+	bool line_wraps(int line) const;
+	int times_line_wraps(int line) const;
+	Vector<String> get_wrap_rows_text(int p_line) const;
+	int get_cursor_wrap_index() const;
+	int get_line_wrap_index_at_col(int p_line, int p_column) const;
 	int get_char_count();
 	int get_char_count();
 
 
+	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_visible_line() const;
+	int get_last_visible_line_wrap_index() const;
+	double get_visible_rows_offset() const;
+	double get_v_scroll_offset() const;
+
+	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;
 	int get_char_pos_for(int p_px, String p_str) const;
 	int get_char_pos_for(int p_px, String p_str) const;
-	int get_column_x_offset(int p_char, String p_str);
+	int get_column_x_offset(int p_char, String p_str) const;
 
 
 	void adjust_viewport_to_cursor();
 	void adjust_viewport_to_cursor();
 	double get_scroll_line_diff() const;
 	double get_scroll_line_diff() const;
@@ -455,8 +478,10 @@ public:
 	bool is_line_hidden(int p_line) const;
 	bool is_line_hidden(int p_line) const;
 	void fold_all_lines();
 	void fold_all_lines();
 	void unhide_all_lines();
 	void unhide_all_lines();
-	int num_lines_from(int p_line_from, int unhidden_amount) const;
-	bool is_last_visible_line(int p_line) 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;
+
 	bool can_fold(int p_line) const;
 	bool can_fold(int p_line) const;
 	bool is_folded(int p_line) const;
 	bool is_folded(int p_line) const;
 	void fold_line(int p_line);
 	void fold_line(int p_line);
@@ -493,7 +518,7 @@ public:
 	void center_viewport_to_cursor();
 	void center_viewport_to_cursor();
 
 
 	void cursor_set_column(int p_col, bool p_adjust_viewport = true);
 	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);
+	void cursor_set_line(int p_row, bool p_adjust_viewport = true, bool p_can_be_hidden = true, int p_wrap_index = 0);
 
 
 	int cursor_get_column() const;
 	int cursor_get_column() const;
 	int cursor_get_line() const;
 	int cursor_get_line() const;
@@ -516,8 +541,8 @@ public:
 	void set_max_chars(int p_max_chars);
 	void set_max_chars(int p_max_chars);
 	int get_max_chars() const;
 	int get_max_chars() const;
 
 
-	void set_wrap(bool p_wrap);
-	bool is_wrapping() const;
+	void set_wrap_enabled(bool p_wrap_enabled);
+	bool is_wrap_enabled() const;
 
 
 	void clear();
 	void clear();
 
 
@@ -578,8 +603,8 @@ public:
 	Color get_member_color(String p_member) const;
 	Color get_member_color(String p_member) const;
 	void clear_member_keywords();
 	void clear_member_keywords();
 
 
-	int get_v_scroll() const;
-	void set_v_scroll(int p_scroll);
+	double get_v_scroll() const;
+	void set_v_scroll(double p_scroll);
 
 
 	int get_h_scroll() const;
 	int get_h_scroll() const;
 	void set_h_scroll(int p_scroll);
 	void set_h_scroll(int p_scroll);

Some files were not shown because too many files changed in this diff