[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41133] trunk/blender/source/blender/ editors/interface: minor changes to test editing

Campbell Barton ideasman42 at gmail.com
Thu Oct 20 09:12:14 CEST 2011


Revision: 41133
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41133
Author:   campbellbarton
Date:     2011-10-20 07:12:14 +0000 (Thu, 20 Oct 2011)
Log Message:
-----------
minor changes to test editing
- use BLI_strncpy_utf8 for utf8 buttons when pasting.
- reuse code for ui_textedit_type_ascii / ui_textedit_type_utf8.
- use memmove rather then for() loops in string editing.
- merge jump/all arguments in interface_handlers.c into one enum arg.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/interface/interface_anim.c
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/editors/interface/interface_intern.h

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c	2011-10-20 07:03:08 UTC (rev 41132)
+++ trunk/blender/source/blender/editors/interface/interface.c	2011-10-20 07:12:14 UTC (rev 41133)
@@ -1747,7 +1747,9 @@
 	}
 	else if(but->type == TEX) {
 		/* string */
-		BLI_strncpy(but->poin, str, but->hardmax);
+		if(ui_is_but_utf8(but)) BLI_strncpy_utf8(but->poin, str, but->hardmax);
+		else                    BLI_strncpy(but->poin, str, but->hardmax);
+
 		return 1;
 	}
 	else if(but->type == SEARCH_MENU) {

Modified: trunk/blender/source/blender/editors/interface/interface_anim.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_anim.c	2011-10-20 07:03:08 UTC (rev 41132)
+++ trunk/blender/source/blender/editors/interface/interface_anim.c	2011-10-20 07:12:14 UTC (rev 41133)
@@ -115,7 +115,7 @@
 		driver= fcu->driver;
 		
 		if(driver && driver->type == DRIVER_TYPE_PYTHON) {
-			BLI_strncpy(driver->expression, str, sizeof(driver->expression));
+			BLI_strncpy_utf8(driver->expression, str, sizeof(driver->expression));
 			driver->flag |= DRIVER_FLAG_RECOMPILE;
 			WM_event_add_notifier(but->block->evil_C, NC_ANIMATION|ND_KEYFRAME, NULL);
 			return 1;
@@ -164,7 +164,7 @@
 			
 			/* set the expression */
 			// TODO: need some way of identifying variables used
-			BLI_strncpy(driver->expression, str, sizeof(driver->expression));
+			BLI_strncpy_utf8(driver->expression, str, sizeof(driver->expression));
 			
 			/* FIXME: for now, assume that 
 			 * 	- for expressions, users are likely to be using "frame" -> current frame" as a variable

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2011-10-20 07:03:08 UTC (rev 41132)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2011-10-20 07:12:14 UTC (rev 41133)
@@ -107,6 +107,12 @@
 	BUTTON_STATE_EXIT
 } uiHandleButtonState;
 
+typedef enum uiButtonJumpType {
+	BUTTON_EDIT_JUMP_NONE,
+	BUTTON_EDIT_JUMP_DELIM,
+	BUTTON_EDIT_JUMP_ALL
+} uiButtonJumpType;
+
 typedef struct uiHandleButtonData {
 	wmWindowManager *wm;
 	wmWindow *window;
@@ -260,7 +266,7 @@
 }
 
 /* file selectors are exempt from utf-8 checks */
-static int ui_is_utf8_but(uiBut *but)
+int ui_is_but_utf8(uiBut *but)
 {
 	if (but->rnaprop) {
 		const int subtype= RNA_property_subtype(but->rnaprop);
@@ -1163,7 +1169,10 @@
 		}
 		else {
 			button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
-			BLI_strncpy(active_data->str, buf, active_data->maxlen);
+
+			if(ui_is_but_utf8(but)) BLI_strncpy_utf8(active_data->str, buf, active_data->maxlen);
+			else                    BLI_strncpy(active_data->str, buf, active_data->maxlen);
+
 			if(but->type == SEARCH_MENU) {
 				/* else uiSearchboxData.active member is not updated [#26856] */
 				ui_searchbox_update(C, data->searchbox, but, 1);
@@ -1282,18 +1291,18 @@
 
 static void ui_textedit_step_utf8(const char *str, size_t maxlen,
                                   short *pos, const char direction,
-                                  const short do_jump, const short do_all)
+                                  uiButtonJumpType jump)
 {
 	const short pos_prev= *pos;
 
 	if(direction) { /* right*/
-		if(do_jump) {
+		if(jump != BUTTON_EDIT_JUMP_NONE) {
 			/* jump between special characters (/,\,_,-, etc.),
 			 * look at function test_special_char() for complete
 			 * list of special character, ctr -> */
 			while((*pos) < maxlen) {
 				if (ui_textedit_step_next_utf8(str, maxlen, pos)) {
-					if(!do_all && test_special_char(str[(*pos)])) break;
+					if((jump != BUTTON_EDIT_JUMP_ALL) && test_special_char(str[(*pos)])) break;
 				}
 				else {
 					break; /* unlikely but just incase */
@@ -1305,7 +1314,7 @@
 		}
 	}
 	else { /* left */
-		if(do_jump) {
+		if(jump != BUTTON_EDIT_JUMP_NONE) {
 			/* left only: compensate for index/change in direction */
 			ui_textedit_step_prev_utf8(str, maxlen, pos);
 
@@ -1314,7 +1323,7 @@
 			 * list of special character, ctr -> */
 			while ((*pos) > 0) {
 				if (ui_textedit_step_prev_utf8(str, maxlen, pos)) {
-					if(!do_all && test_special_char(str[(*pos)])) break;
+					if((jump != BUTTON_EDIT_JUMP_ALL) && test_special_char(str[(*pos)])) break;
 				}
 				else {
 					break;
@@ -1432,24 +1441,23 @@
 static int ui_textedit_type_utf8(uiBut *but, uiHandleButtonData *data, const char utf8_buf[6])
 {
 	char *str;
-	int len, x, changed= 0;
-	size_t step= BLI_strnlen(utf8_buf, sizeof(utf8_buf));
+	int len, changed= 0;
 
 	str= data->str;
 	len= strlen(str);
 
 	if(len-(but->selend - but->selsta)+1 <= data->maxlen) {
+		int step= BLI_strnlen(utf8_buf, sizeof(utf8_buf));
+
 		/* type over the current selection */
-		if ((but->selend - but->selsta) > 0)
+		if ((but->selend - but->selsta) > 0) {
 			changed= ui_textedit_delete_selection(but, data);
+			len= strlen(str);
+		}
 
-		len= strlen(str);
-		if(len+step < data->maxlen) {
-			for(x= data->maxlen; x>but->pos; x--)
-				str[x]= str[x-step];
+		if(len + step < data->maxlen) {
+			memmove(&str[but->pos + step], &str[but->pos], (len + 1) - but->pos);
 			memcpy(&str[but->pos], utf8_buf, step * sizeof(char));
-			str[len+step]= '\0';
-
 			but->pos += step;
 			changed= 1;
 		}
@@ -1460,33 +1468,11 @@
 
 static int ui_textedit_type_ascii(uiBut *but, uiHandleButtonData *data, char ascii)
 {
-	char *str;
-	int len, x, changed= 0;
-
-	str= data->str;
-	len= strlen(str);
-
-	if(len-(but->selend - but->selsta)+1 <= data->maxlen) {
-		/* type over the current selection */
-		if ((but->selend - but->selsta) > 0)
-			changed= ui_textedit_delete_selection(but, data);
-
-		len= strlen(str);
-		if(len+1 < data->maxlen) {
-			for(x= data->maxlen; x>but->pos; x--)
-				str[x]= str[x-1];
-			str[but->pos]= ascii;
-			str[len+1]= '\0';
-
-			but->pos++; 
-			changed= 1;
-		}
-	}
-
-	return changed;
+	char utf8_buf[6]= {ascii, '\0'};
+	return ui_textedit_type_utf8(but, data, utf8_buf);
 }
 
-static void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int select, int jump, int jump_all)
+static void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int select, uiButtonJumpType jump)
 {
 	const char *str= data->str;
 	const int len= strlen(str);
@@ -1495,7 +1481,7 @@
 
 	/* special case, quit selection and set cursor */
 	if (has_sel && !select) {
-		if (jump_all) {
+		if (jump == BUTTON_EDIT_JUMP_ALL) {
 			but->selsta = but->selend= but->pos = direction ? len : 0;
 		}
 		else {
@@ -1509,7 +1495,7 @@
 		data->selextend = 0;
 	}
 	else {
-		ui_textedit_step_utf8(str, len, &but->pos, direction, jump, jump_all);
+		ui_textedit_step_utf8(str, len, &but->pos, direction, jump);
 
 		if(select) {
 			/* existing selection */
@@ -1558,35 +1544,33 @@
 	}
 }
 
-static int ui_textedit_delete(uiBut *but, uiHandleButtonData *data, int direction, const int all, const int jump)
+static int ui_textedit_delete(uiBut *but, uiHandleButtonData *data, int direction, uiButtonJumpType jump)
 {
 	char *str= data->str;
 	const int len= strlen(str);
 
-	int x, changed= 0;
+	int changed= 0;
 
-	if(all) {
+	if(jump == BUTTON_EDIT_JUMP_ALL) {
 		if(len) changed=1;
-		str[0]= 0;
+		str[0]= '\0';
 		but->pos= 0;
 	}
 	else if(direction) { /* delete */
 		if ((but->selend - but->selsta) > 0) {
 			changed= ui_textedit_delete_selection(but, data);
 		}
-		else if(but->pos>=0 && but->pos<len) {
+		else if (but->pos>=0 && but->pos<len) {
 			short pos= but->pos;
 			int step;
-			ui_textedit_step_utf8(str, len, &pos, direction, jump, all);
+			ui_textedit_step_utf8(str, len, &pos, direction, jump);
 			step= pos - but->pos;
-			for(x=but->pos; x<len; x++)
-				str[x]= str[x+step];
-			str[len-step]='\0';
+			memmove(&str[but->pos], &str[but->pos + step], (len + 1) - but->pos);
 			changed= 1;
 		}
 	}
 	else { /* backspace */
-		if(len!=0) {
+		if (len != 0) {
 			if ((but->selend - but->selsta) > 0) {
 				changed= ui_textedit_delete_selection(but, data);
 			}
@@ -1594,13 +1578,9 @@
 				short pos= but->pos;
 				int step;
 
-				ui_textedit_step_utf8(str, len, &pos, direction, jump, all);
+				ui_textedit_step_utf8(str, len, &pos, direction, jump);
 				step= but->pos - pos;
-
-				for(x=but->pos; x<len; x++)
-					str[x-step]= str[x];
-				str[len-step]='\0';
-
+				memmove(&str[but->pos - step], &str[but->pos], (len + 1) - but->pos);
 				but->pos -= step;
 				changed= 1;
 			}
@@ -1710,19 +1690,9 @@
 	ui_get_but_string(but, data->str, data->maxlen);
 
 	if(ELEM3(but->type, NUM, NUMABS, NUMSLI)) {
-		/* XXX: we dont have utf editing yet so for numbers its best to strip out utf chars 
-		 * this is so the deg' synbol isnt included in number editing fields: bug 22274 */
-		int i;
-		for(i=0; data->str[i]; i++) {
-			if(!isascii(data->str[i])) {
-				/* no stripping actually: just convert to alt name */
-				ui_convert_to_unit_alt_name(but, data->str, data->maxlen);
-				break;
-			}
-		}
+		ui_convert_to_unit_alt_name(but, data->str, data->maxlen);
 	}
-	
-	
+
 	data->origstr= BLI_strdup(data->str);
 	data->selextend= 0;
 	data->selstartx= 0;
@@ -1747,7 +1717,7 @@
 static void ui_textedit_end(bContext *C, uiBut *but, uiHandleButtonData *data)
 {
 	if(but) {
-		if(ui_is_utf8_but(but)) {
+		if(ui_is_but_utf8(but)) {
 			int strip= BLI_utf8_invalid_strip(but->editstr, strlen(but->editstr));
 			/* not a file?, strip non utf-8 chars */
 			if(strip) {
@@ -1899,11 +1869,11 @@
 				}
 				break;
 			case RIGHTARROWKEY:
-				ui_textedit_move(but, data, 1, event->shift, event->ctrl, FALSE);
+				ui_textedit_move(but, data, 1, event->shift, event->ctrl ? BUTTON_EDIT_JUMP_DELIM : BUTTON_EDIT_JUMP_NONE);
 				retval= WM_UI_HANDLER_BREAK;
 				break;
 			case LEFTARROWKEY:
-				ui_textedit_move(but, data, 0, event->shift, event->ctrl, FALSE);
+				ui_textedit_move(but, data, 0, event->shift, event->ctrl ? BUTTON_EDIT_JUMP_DELIM : BUTTON_EDIT_JUMP_NONE);
 				retval= WM_UI_HANDLER_BREAK;
 				break;
 			case DOWNARROWKEY:
@@ -1913,7 +1883,7 @@
 				}
 				/* pass on purposedly */
 			case ENDKEY:
-				ui_textedit_move(but, data, 1, event->shift, TRUE, TRUE);
+				ui_textedit_move(but, data, 1, event->shift, BUTTON_EDIT_JUMP_ALL);
 				retval= WM_UI_HANDLER_BREAK;
 				break;
 			case UPARROWKEY:
@@ -1923,7 +1893,7 @@
 				}

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list