diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-09-10 15:08:40 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-09-10 17:00:24 +0400 |
commit | 3ad902764802b74868d623eea8da460948db2798 (patch) | |
tree | 734f0b8d45f6c2105c0f41b6f105b35b8ced49a3 /source | |
parent | 64e955f52228b573aeffb96d0b74db8eb6931190 (diff) |
Text3D: fixes to selection
- clamp selection on entering editmode (Python may have changed).
- BKE_vfont_select_get no longer succeeds with an empty selection
this caused many operators to go ahead and operate on zero size array.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_font.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/font.c | 42 | ||||
-rw-r--r-- | source/blender/editors/curve/editfont.c | 3 |
3 files changed, 38 insertions, 8 deletions
diff --git a/source/blender/blenkernel/BKE_font.h b/source/blender/blenkernel/BKE_font.h index b60c833c686..e12ce3df476 100644 --- a/source/blender/blenkernel/BKE_font.h +++ b/source/blender/blenkernel/BKE_font.h @@ -93,6 +93,7 @@ bool BKE_vfont_to_curve_nubase(struct Main *bmain, struct Object *ob, int mode, bool BKE_vfont_to_curve(struct Main *bmain, struct Object *ob, int mode); int BKE_vfont_select_get(struct Object *ob, int *r_start, int *r_end); +void BKE_vfont_select_clamp(struct Object *ob); #ifdef __cplusplus } diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 3b53c579496..947bd9f4255 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -484,24 +484,50 @@ int BKE_vfont_select_get(Object *ob, int *r_start, int *r_end) { Curve *cu = ob->data; EditFont *ef = cu->editfont; + int start, end, direction; if ((ob->type != OB_FONT) || (ef == NULL)) return 0; BLI_assert(ef->selstart >= 0 && ef->selstart <= ef->len + 1); - BLI_assert(ef->selend >= 0 && ef->selend <= ef->len + 1); + BLI_assert(ef->selend >= 0 && ef->selend <= ef->len); BLI_assert(ef->pos >= 0 && ef->pos <= ef->len); - if (ef->selstart == 0) return 0; + if (ef->selstart == 0) { + return 0; + } + if (ef->selstart <= ef->selend) { - *r_start = ef->selstart - 1; - *r_end = ef->selend - 1; - return 1; + start = ef->selstart - 1; + end = ef->selend - 1; + direction = 1; } else { - *r_start = ef->selend; - *r_end = ef->selstart - 2; - return -1; + start = ef->selend; + end = ef->selstart - 2; + direction = -1; + } + + if (start == end + 1) { + return 0; } + else { + BLI_assert(start < end + 1); + *r_start = start; + *r_end = end; + return direction; + } +} + +void BKE_vfont_select_clamp(Object *ob) +{ + Curve *cu = ob->data; + EditFont *ef = cu->editfont; + + BLI_assert((ob->type == OB_FONT) && ef); + + CLAMP_MAX(ef->pos, ef->len); + CLAMP_MAX(ef->selstart, ef->len + 1); + CLAMP_MAX(ef->selend, ef->len); } static float char_width(Curve *cu, VChar *che, CharInfo *info) diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c index 36e1210402d..d1f628dd0ea 100644 --- a/source/blender/editors/curve/editfont.c +++ b/source/blender/editors/curve/editfont.c @@ -1594,6 +1594,9 @@ void make_editText(Object *obedit) ef->pos = cu->pos; ef->selstart = cu->selstart; ef->selend = cu->selend; + + /* text may have been modified by Python */ + BKE_vfont_select_clamp(obedit); } void load_editText(Object *obedit) |