From 26cbf331a858db0ac49e2de8b60ae7710a8c7c66 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 2 Sep 2013 00:47:27 +0000 Subject: text editor cursor motion (left/right arrows) with selected text typically jumps to either side of the selection previously the cursor would move and loose the selection too. text button fields already did this. --- source/blender/blenkernel/BKE_text.h | 2 +- source/blender/blenkernel/intern/text.c | 27 ++++++++++++++++++--------- source/blender/editors/space_text/text_ops.c | 24 ++++++++++++++++++------ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h index 24fd763d078..bba209334d4 100644 --- a/source/blender/blenkernel/BKE_text.h +++ b/source/blender/blenkernel/BKE_text.h @@ -58,7 +58,7 @@ void BKE_text_write (struct Text *text, const char *str); char *txt_to_buf (struct Text *text); void txt_clean_text (struct Text *text); -void txt_order_cursors (struct Text *text); +void txt_order_cursors (struct Text *text, const bool reverse); int txt_find_string (struct Text *text, const char *findstr, int wrap, int match_case); int txt_has_sel (struct Text *text); int txt_get_span (struct TextLine *from, struct TextLine *to); diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index f0c01e25598..750f328e7e7 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -1151,17 +1151,26 @@ void txt_pop_sel(Text *text) text->selc = text->curc; } -void txt_order_cursors(Text *text) +void txt_order_cursors(Text *text, const bool reverse) { if (!text) return; if (!text->curl) return; if (!text->sell) return; - /* Flip so text->curl is before text->sell */ - if ((txt_get_span(text->curl, text->sell) < 0) || - (text->curl == text->sell && text->curc > text->selc)) - { - txt_curs_swap(text); + /* Flip so text->curl is before/after text->sell */ + if (reverse == false) { + if ((txt_get_span(text->curl, text->sell) < 0) || + (text->curl == text->sell && text->curc > text->selc)) + { + txt_curs_swap(text); + } + } + else { + if ((txt_get_span(text->curl, text->sell) > 0) || + (text->curl == text->sell && text->curc < text->selc)) + { + txt_curs_swap(text); + } } } @@ -1181,7 +1190,7 @@ static void txt_delete_sel(Text *text) if (!txt_has_sel(text)) return; - txt_order_cursors(text); + txt_order_cursors(text, false); if (!undoing) { buf = txt_sel_to_buf(text); @@ -1305,7 +1314,7 @@ int txt_find_string(Text *text, const char *findstr, int wrap, int match_case) if (!text || !text->curl || !text->sell) return 0; - txt_order_cursors(text); + txt_order_cursors(text, false); tl = startl = text->sell; @@ -2833,7 +2842,7 @@ void txt_move_lines(struct Text *text, const int direction) if (!text || !text->curl || !text->sell) return; - txt_order_cursors(text); + txt_order_cursors(text, false); line_other = (direction == TXT_MOVE_LINE_DOWN) ? text->sell->next : text->curl->prev; diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index 410abec706b..0baec4d030c 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -949,7 +949,7 @@ static int text_indent_exec(bContext *C, wmOperator *UNUSED(op)) text_drawcache_tag_update(CTX_wm_space_text(C), 0); if (txt_has_sel(text)) { - txt_order_cursors(text); + txt_order_cursors(text, false); txt_indent(text); } else @@ -983,7 +983,7 @@ static int text_unindent_exec(bContext *C, wmOperator *UNUSED(op)) text_drawcache_tag_update(CTX_wm_space_text(C), 0); - txt_order_cursors(text); + txt_order_cursors(text, false); txt_unindent(text); text_update_edited(text); @@ -1063,7 +1063,7 @@ static int text_comment_exec(bContext *C, wmOperator *UNUSED(op)) if (txt_has_sel(text)) { text_drawcache_tag_update(CTX_wm_space_text(C), 0); - txt_order_cursors(text); + txt_order_cursors(text, false); txt_comment(text); text_update_edited(text); @@ -1096,7 +1096,7 @@ static int text_uncomment_exec(bContext *C, wmOperator *UNUSED(op)) if (txt_has_sel(text)) { text_drawcache_tag_update(CTX_wm_space_text(C), 0); - txt_order_cursors(text); + txt_order_cursors(text, false); txt_uncomment(text); text_update_edited(text); @@ -1861,11 +1861,23 @@ static int text_move_cursor(bContext *C, int type, int select) break; case PREV_CHAR: - txt_move_left(text, select); + if (txt_has_sel(text)) { + txt_order_cursors(text, false); + txt_pop_sel(text); + } + else { + txt_move_left(text, select); + } break; case NEXT_CHAR: - txt_move_right(text, select); + if (txt_has_sel(text)) { + txt_order_cursors(text, true); + txt_pop_sel(text); + } + else { + txt_move_right(text, select); + } break; case PREV_LINE: -- cgit v1.2.3