TextEdit folding over unindented comments

(cherry picked from commit d327f75392)
This commit is contained in:
Ian 2018-01-12 00:25:04 -05:00 committed by Hein-Pieter van Braam
parent 99efa7ce62
commit 723613dbc3
2 changed files with 38 additions and 7 deletions

View File

@ -217,7 +217,7 @@ void TextEdit::Text::_update_line_cache(int p_line) const {
} }
} }
const Map<int, TextEdit::Text::ColorRegionInfo> &TextEdit::Text::get_color_region_info(int p_line) { const Map<int, TextEdit::Text::ColorRegionInfo> &TextEdit::Text::get_color_region_info(int p_line) const {
static Map<int, ColorRegionInfo> cri; static Map<int, ColorRegionInfo> cri;
ERR_FAIL_INDEX_V(p_line, text.size(), cri); ERR_FAIL_INDEX_V(p_line, text.size(), cri);
@ -4710,8 +4710,6 @@ int TextEdit::get_indent_level(int p_line) const {
tab_count++; tab_count++;
} else if (text[p_line][i] == ' ') { } else if (text[p_line][i] == ' ') {
whitespace_count++; whitespace_count++;
} else if (text[p_line][i] == '#') {
break;
} else { } else {
break; break;
} }
@ -4719,6 +4717,31 @@ int TextEdit::get_indent_level(int p_line) const {
return tab_count + whitespace_count / indent_size; return tab_count + whitespace_count / indent_size;
} }
bool TextEdit::is_line_comment(int p_line) const {
// checks to see if this line is the start of a comment
ERR_FAIL_INDEX_V(p_line, text.size(), false);
const Map<int, Text::ColorRegionInfo> &cri_map = text.get_color_region_info(p_line);
int line_length = text[p_line].size();
for (int i = 0; i < line_length - 1; i++) {
if (_is_symbol(text[p_line][i]) && cri_map.has(i)) {
const Text::ColorRegionInfo &cri = cri_map[i];
if (color_regions[cri.region].begin_key == "#" || color_regions[cri.region].begin_key == "//") {
return true;
} else {
return false;
}
} else if (_is_whitespace(text[p_line][i])) {
continue;
} else {
break;
}
}
return false;
}
bool TextEdit::can_fold(int p_line) const { bool TextEdit::can_fold(int p_line) const {
ERR_FAIL_INDEX_V(p_line, text.size(), false); ERR_FAIL_INDEX_V(p_line, text.size(), false);
@ -4732,6 +4755,8 @@ bool TextEdit::can_fold(int p_line) const {
return false; return false;
if (is_line_hidden(p_line)) if (is_line_hidden(p_line))
return false; return false;
if (is_line_comment(p_line))
return false;
int start_indent = get_indent_level(p_line); int start_indent = get_indent_level(p_line);
@ -4739,11 +4764,14 @@ bool TextEdit::can_fold(int p_line) const {
if (text[i].size() == 0) if (text[i].size() == 0)
continue; continue;
int next_indent = get_indent_level(i); int next_indent = get_indent_level(i);
if (next_indent > start_indent) if (is_line_comment(i)) {
continue;
} else if (next_indent > start_indent) {
return true; return true;
else } else {
return false; return false;
} }
}
return false; return false;
} }
@ -4771,7 +4799,9 @@ void TextEdit::fold_line(int p_line) {
int last_line = start_indent; int last_line = start_indent;
for (int i = p_line + 1; i < text.size(); i++) { for (int i = p_line + 1; i < text.size(); i++) {
if (text[i].strip_edges().size() != 0) { if (text[i].strip_edges().size() != 0) {
if (get_indent_level(i) > start_indent) { if (is_line_comment(i)) {
continue;
} else if (get_indent_level(i) > start_indent) {
last_line = i; last_line = i;
} else { } else {
break; break;

View File

@ -162,7 +162,7 @@ class TextEdit : public Control {
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;
const Map<int, ColorRegionInfo> &get_color_region_info(int p_line); 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; }
bool is_marked(int p_line) const { return text[p_line].marked; } bool is_marked(int p_line) const { return text[p_line].marked; }
@ -450,6 +450,7 @@ public:
void indent_left(); void indent_left();
void indent_right(); void indent_right();
int get_indent_level(int p_line) const; int get_indent_level(int p_line) const;
bool is_line_comment(int p_line) const;
inline void set_scroll_pass_end_of_file(bool p_enabled) { inline void set_scroll_pass_end_of_file(bool p_enabled) {
scroll_past_end_of_file_enabled = p_enabled; scroll_past_end_of_file_enabled = p_enabled;