Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add copy codeblock button to built-in documentation #87363

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 29 additions & 10 deletions editor/editor_help.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,8 @@ void EditorHelp::_class_desc_select(const String &p_select) {
}
} else if (p_select.begins_with("http")) {
OS::get_singleton()->shell_open(p_select);
} else if (p_select.begins_with("^")) {
DisplayServer::get_singleton()->clipboard_set(p_select.trim_prefix("^"));
}
}

Expand Down Expand Up @@ -2386,6 +2388,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
bool code_tag = false;
bool codeblock_tag = false;
const bool using_tab_indent = int(EDITOR_GET("text_editor/behavior/indent/type")) == 0;
StringBuilder codeblock_text;

int pos = 0;
while (pos < bbcode.length()) {
Expand Down Expand Up @@ -2419,6 +2422,9 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
if (!code_tag && !codeblock_tag) {
text = text.replace("\n", "\n\n");
}
if (codeblock_tag) {
codeblock_text.append(text);
}
p_rt->add_text(text);
}

Expand Down Expand Up @@ -2452,30 +2458,43 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
tag_stack.pop_front();
pos = brk_end + 1;
if (tag != "/img") {
p_rt->pop();
if (code_tag) {
p_rt->pop(); // color
p_rt->pop(); // background color
p_rt->pop(); // font size
// Pop both color and background color.
p_rt->pop();
p_rt->pop();
} else if (codeblock_tag) {
p_rt->pop(); // color
p_rt->pop(); // cell

// Copy codeblock button.
p_rt->push_cell();
p_rt->set_cell_row_background_color(code_bg_color, Color(code_bg_color, 0.99));
p_rt->set_cell_padding(Rect2(0, 10 * EDSCALE, 0, 10 * EDSCALE));
p_rt->set_cell_size_override(Vector2(1, 1), Vector2(10, 10) * EDSCALE);
p_rt->push_meta("^" + codeblock_text.as_string(), RichTextLabel::META_UNDERLINE_ON_HOVER);
codeblock_text = StringBuilder();
p_rt->add_image(p_owner_node->get_editor_theme_icon(SNAME("ActionCopy")), 24 * EDSCALE, 24 * EDSCALE, Color(link_property_color, 0.3), INLINE_ALIGNMENT_BOTTOM_TO, Rect2(), Variant(), false, TTR("Click to copy."));
p_rt->pop(); // meta
p_rt->pop(); // cell

p_rt->pop(); // table
p_rt->pop(); // font size
// Pop color, cell and table.
p_rt->pop();
p_rt->pop();
p_rt->pop();

if (pos < bbcode.length()) {
p_rt->add_newline();
}
}
p_rt->pop(); // Pops font for codetags & codeblocks, anything else for other tags.
}
code_tag = false;
codeblock_tag = false;

} else if (code_tag || codeblock_tag) {
p_rt->add_text("[");
pos = brk_pos + 1;

if (codeblock_tag) {
codeblock_text.append("[");
}
} else if (tag.begins_with("method ") || tag.begins_with("constructor ") || tag.begins_with("operator ") || tag.begins_with("member ") || tag.begins_with("signal ") || tag.begins_with("enum ") || tag.begins_with("constant ") || tag.begins_with("annotation ") || tag.begins_with("theme_item ")) {
const int tag_end = tag.find_char(' ');
const String link_tag = tag.substr(0, tag_end);
Expand Down Expand Up @@ -2575,7 +2594,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control
p_rt->push_font(doc_code_font);
p_rt->push_font_size(doc_code_font_size);

p_rt->push_table(1);
p_rt->push_table(2);
p_rt->push_cell();
p_rt->set_cell_row_background_color(code_bg_color, Color(code_bg_color, 0.99));
p_rt->set_cell_padding(Rect2(10 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE));
Expand Down
Loading