[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44775] trunk/blender/source/blender: picky changes to mouse cursor text selection behavior, previously as soon as the mouse was before a character it would select the previous , even if the cursor was closer to the space between the next 2 chars.

Campbell Barton ideasman42 at gmail.com
Sat Mar 10 00:10:20 CET 2012


Revision: 44775
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44775
Author:   campbellbarton
Date:     2012-03-09 23:10:07 +0000 (Fri, 09 Mar 2012)
Log Message:
-----------
picky changes to mouse cursor text selection behavior, previously as soon as the mouse was before a character it would select the previous, even if the cursor was closer to the space between the next 2 chars.

now find the closest point inbetween both chars.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/editors/space_text/text_ops.c

Modified: trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2012-03-09 22:00:40 UTC (rev 44774)
+++ trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2012-03-09 23:10:07 UTC (rev 44775)
@@ -120,9 +120,8 @@
 		f->mat_nr = mp->mat_nr;
 
 		l = BM_iter_new(&liter, bm, BM_LOOPS_OF_FACE, f);
-		k = mp->loopstart;
 
-		for (j = 0; l; l = BM_iter_step(&liter), k++) {
+		for (k = mp->loopstart; l; l = BM_iter_step(&liter), k++) {
 			CustomData_to_bmesh_block(&dm->loopData, &bm->ldata, k, &l->head.data);
 		}
 

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2012-03-09 22:00:40 UTC (rev 44774)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2012-03-09 23:10:07 UTC (rev 44775)
@@ -1282,13 +1282,33 @@
 	}
 	/* mouse inside the widget */
 	else if (x >= startx) {
+		int pos_i;
+
+		/* keep track of previous distance from the cursor to the char */
+		float cdist, cdist_prev = 0.0f;
+		short pos_prev;
+
 		const float aspect_sqrt= sqrtf(but->block->aspect);
 		
-		but->pos= strlen(origstr)-but->ofs;
-		
-		/* XXX does not take zoom level into account */
-		while (startx + aspect_sqrt * BLF_width(fstyle->uifont_id, origstr+but->ofs) > x) {
-			int pos_i = but->pos;
+		but->pos = pos_prev = strlen(origstr) - but->ofs;
+
+		while (TRUE) {
+			/* XXX does not take zoom level into account */
+			cdist = startx + aspect_sqrt * BLF_width(fstyle->uifont_id, origstr + but->ofs);
+
+			/* check if position is found */
+			if (cdist < x) {
+				/* check is previous location was infact closer */
+				if (((float)x - cdist) > (cdist_prev - (float)x)) {
+					but->pos = pos_prev;
+				}
+				break;
+			}
+			cdist_prev = cdist;
+			pos_prev   = but->pos;
+			/* done with tricky distance checks */
+
+			pos_i = but->pos;
 			if (but->pos <= 0) break;
 			if (BLI_str_cursor_step_prev_utf8(origstr, but->ofs, &pos_i)) {
 				but->pos = pos_i;
@@ -1580,6 +1600,8 @@
 
 static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
 {
+	int len;
+
 	if(data->str) {
 		MEM_freeN(data->str);
 		data->str= NULL;
@@ -1594,15 +1616,18 @@
 		ui_convert_to_unit_alt_name(but, data->str, data->maxlen);
 	}
 
-	data->origstr= BLI_strdup(data->str);
-	data->selextend= 0;
-	data->selstartx= 0;
+	/* won't change from now on */
+	len = strlen(data->str);
 
+	data->origstr = BLI_strdupn(data->str, len);
+	data->selextend = 0;
+	data->selstartx = 0;
+
 	/* set cursor pos to the end of the text */
-	but->editstr= data->str;
-	but->pos= strlen(data->str);
-	but->selsta= 0;
-	but->selend= strlen(data->str);
+	but->editstr = data->str;
+	but->pos = len;
+	but->selsta = 0;
+	but->selend = len;
 
 	/* optional searchbox */
 	if(but->type==SEARCH_MENU) {

Modified: trunk/blender/source/blender/editors/space_text/text_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_text/text_ops.c	2012-03-09 22:00:40 UTC (rev 44774)
+++ trunk/blender/source/blender/editors/space_text/text_ops.c	2012-03-09 23:10:07 UTC (rev 44775)
@@ -73,6 +73,13 @@
 
 /************************ poll ***************************/
 
+
+BM_INLINE int text_pixel_x_to_index(SpaceText *st, const int x)
+{
+	/* add half the char width so mouse cursor selection is inbetween letters */
+	return (x + (st->cwidth / 2)) / st->cwidth;
+}
+
 static int text_new_poll(bContext *UNUSED(C))
 {
 	return 1;
@@ -2530,7 +2537,7 @@
 	else x-= TXT_OFFSET;
 
 	if(x<0) x= 0;
-	x = (x/st->cwidth) + st->left;
+	x = text_pixel_x_to_index(st, x) + st->left;
 	
 	if(st->wordwrap) {
 		text_cursor_set_to_pos_wrapped(st, ar, x, y, sel);




More information about the Bf-blender-cvs mailing list