Text3D: fixes to selection
authorCampbell Barton <ideasman42@gmail.com>
Wed, 10 Sep 2014 11:08:40 +0000 (21:08 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 10 Sep 2014 13:00:24 +0000 (23:00 +1000)
- 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.

source/blender/blenkernel/BKE_font.h
source/blender/blenkernel/intern/font.c
source/blender/editors/curve/editfont.c

index b60c833c68613c3f50e9c071b5eb09d60d369bec..e12ce3df4762c622bfae173c1af29ec0787f1982 100644 (file)
@@ -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
 }
index 3b53c579496d6a071fe6bb2ea60f99332124e203..947bd9f4255cd98c431cbeb8a7013471aa0f317b 100644 (file)
@@ -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)
index 36e1210402db784d7b93bba5a7f225083bd5fc2f..d1f628dd0ea702cd6c2a79568a4a21544cf735cd 100644 (file)
@@ -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)