paint: add tab_scripts_toggle_comment
This commit is contained in:
@@ -182,6 +182,58 @@ static void tab_scripts_autocomplete_complete(char *name, i32 prefix_len, i32 su
|
|||||||
tab_scripts_ac_show = false;
|
tab_scripts_ac_show = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tab_scripts_toggle_comment() {
|
||||||
|
tab_scripts_prepare();
|
||||||
|
char *text = g_project->script_datas->buffer[tab_scripts_selected];
|
||||||
|
i32 line = tab_scripts_hscript->i;
|
||||||
|
i32 col = g_ui->cursor_x;
|
||||||
|
i32 start = tab_scripts_line_start(text, line);
|
||||||
|
i32 end = start;
|
||||||
|
while (text[end] != '\0' && text[end] != '\n') {
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
// Indentation level: first non-space char on the line
|
||||||
|
i32 ind = start;
|
||||||
|
while (ind < end && text[ind] == ' ') {
|
||||||
|
ind++;
|
||||||
|
}
|
||||||
|
i32 ind_col = ind - start;
|
||||||
|
|
||||||
|
i32 delta;
|
||||||
|
char *before = substring(text, 0, ind);
|
||||||
|
if (text[ind] == '/' && ind + 1 < end && text[ind + 1] == '/') {
|
||||||
|
// Remove "// " or "//"
|
||||||
|
i32 remove = (ind + 2 < end && text[ind + 2] == ' ') ? 3 : 2;
|
||||||
|
char *after = substring(text, ind + remove, string_length(text));
|
||||||
|
tab_scripts_set(string("%s%s", before, after));
|
||||||
|
delta = -remove;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Prepend "// "
|
||||||
|
char *after = substring(text, ind, string_length(text));
|
||||||
|
tab_scripts_set(string("%s// %s", before, after));
|
||||||
|
delta = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
tab_scripts_hscript->text = g_project->script_datas->buffer[tab_scripts_selected];
|
||||||
|
|
||||||
|
// Keep the caret on the same characters
|
||||||
|
i32 new_col;
|
||||||
|
if (col <= ind_col) {
|
||||||
|
new_col = col; // Caret within indentation, unaffected
|
||||||
|
}
|
||||||
|
else if (delta < 0 && col < ind_col - delta) {
|
||||||
|
new_col = ind_col; // Caret was inside the removed "// "
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
new_col = col + delta;
|
||||||
|
}
|
||||||
|
g_ui->cursor_x = new_col;
|
||||||
|
g_ui->highlight_anchor = new_col;
|
||||||
|
g_ui->cursor_sticky_x = new_col;
|
||||||
|
strcpy(g_ui->text_selected, ui_extract_line(tab_scripts_hscript->text, line)); // Keep the active line in sync
|
||||||
|
}
|
||||||
|
|
||||||
void tab_scripts_draw(ui_handle_t *htab) {
|
void tab_scripts_draw(ui_handle_t *htab) {
|
||||||
if (ui_tab(htab, tr("Scripts"), false, -1, false)) {
|
if (ui_tab(htab, tr("Scripts"), false, -1, false)) {
|
||||||
|
|
||||||
@@ -252,6 +304,13 @@ void tab_scripts_draw(ui_handle_t *htab) {
|
|||||||
minic_register_builtins(); // Ensure the script api is registered
|
minic_register_builtins(); // Ensure the script api is registered
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Toggle line comment on ctrl+/
|
||||||
|
if (ac_selected && g_ui->is_ctrl_down && g_ui->is_key_pressed && g_ui->key_code == KEY_CODE_SLASH) {
|
||||||
|
tab_scripts_toggle_comment();
|
||||||
|
g_ui->is_key_pressed = false; // Consume so the editor ignores ctrl+/
|
||||||
|
g_ui->key_code = 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool ac_accept = false;
|
bool ac_accept = false;
|
||||||
if (tab_scripts_ac_show && ac_selected && g_ui->is_key_pressed) {
|
if (tab_scripts_ac_show && ac_selected && g_ui->is_key_pressed) {
|
||||||
if (g_ui->key_code == KEY_CODE_DOWN) {
|
if (g_ui->key_code == KEY_CODE_DOWN) {
|
||||||
|
|||||||
Reference in New Issue
Block a user