[Bf-blender-cvs] [f5aa50853cf] master: 3D Text: Make Ctrl Backspace/Del delete words

Campbell Barton noreply at git.blender.org
Thu Sep 21 12:32:12 CEST 2017


Commit: f5aa50853cf6f0b262dde4a2988752fd0995f8f2
Author: Campbell Barton
Date:   Thu Sep 21 20:41:09 2017 +1000
Branches: master
https://developer.blender.org/rBf5aa50853cf6f0b262dde4a2988752fd0995f8f2

3D Text: Make Ctrl Backspace/Del delete words

Matches text-editor, console & text-button.

===================================================================

M	source/blender/editors/curve/curve_intern.h
M	source/blender/editors/curve/curve_ops.c
M	source/blender/editors/curve/editfont.c
M	source/blender/editors/space_console/console_intern.h

===================================================================

diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h
index 856573ffab0..02c76a840f1 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -40,7 +40,7 @@ struct wmOperatorType;
 struct ViewContext;
 
 /* editfont.c */
-enum { DEL_ALL, DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };
+enum { DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_NEXT_WORD, DEL_PREV_WORD, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };
 enum { CASE_LOWER, CASE_UPPER };
 enum { LINE_BEGIN, LINE_END, PREV_CHAR, NEXT_CHAR, PREV_WORD, NEXT_WORD,
        PREV_LINE, NEXT_LINE, PREV_PAGE, NEXT_PAGE };
diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c
index fce6425b9be..5d637b113d8 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -178,9 +178,10 @@ void ED_keymap_curve(wmKeyConfig *keyconf)
 	RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", PKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_CHINFO_SMALLCAPS);
 
 	RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_SEL);
+	RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", DELKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_WORD);
 	RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_SEL);
 	RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", DEL_PREV_SEL); /* same as above [#26623] */
-	RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_ALL);
+	RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_PREV_WORD);
 
 	RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", HOMEKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_BEGIN);
 	RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", ENDKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_END);
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index b4ac4ae7cac..535e5d7bd28 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -1170,9 +1170,10 @@ void FONT_OT_line_break(wmOperatorType *ot)
 /******************* delete operator **********************/
 
 static EnumPropertyItem delete_type_items[] = {
-	{DEL_ALL, "ALL", 0, "All", ""},
 	{DEL_NEXT_CHAR, "NEXT_CHARACTER", 0, "Next Character", ""},
 	{DEL_PREV_CHAR, "PREVIOUS_CHARACTER", 0, "Previous Character", ""},
+	{DEL_NEXT_WORD, "NEXT_WORD", 0, "Next Word", ""},
+	{DEL_PREV_WORD, "PREVIOUS_WORD", 0, "Previous Word", ""},
 	{DEL_SELECTION, "SELECTION", 0, "Selection", ""},
 	{DEL_NEXT_SEL, "NEXT_OR_SELECTION", 0, "Next or Selection", ""},
 	{DEL_PREV_SEL, "PREVIOUS_OR_SELECTION", 0, "Previous or Selection", ""},
@@ -1183,7 +1184,9 @@ static int delete_exec(bContext *C, wmOperator *op)
 	Object *obedit = CTX_data_edit_object(C);
 	Curve *cu = obedit->data;
 	EditFont *ef = cu->editfont;
-	int x, selstart, selend, type = RNA_enum_get(op->ptr, "type");
+	int selstart, selend, type = RNA_enum_get(op->ptr, "type");
+	int range[2] = {0, 0};
+	bool has_select = false;
 
 	if (ef->len == 0)
 		return OPERATOR_CANCELLED;
@@ -1191,6 +1194,7 @@ static int delete_exec(bContext *C, wmOperator *op)
 	if (BKE_vfont_select_get(obedit, &selstart, &selend)) {
 		if (type == DEL_NEXT_SEL) type = DEL_SELECTION;
 		else if (type == DEL_PREV_SEL) type = DEL_SELECTION;
+		has_select = true;
 	}
 	else {
 		if (type == DEL_NEXT_SEL) type = DEL_NEXT_CHAR;
@@ -1198,11 +1202,6 @@ static int delete_exec(bContext *C, wmOperator *op)
 	}
 
 	switch (type) {
-		case DEL_ALL:
-			ef->len = ef->pos = 0;
-			ef->textbuf[0] = 0;
-			BKE_vfont_select_clamp(obedit);
-			break;
 		case DEL_SELECTION:
 			if (!kill_selection(obedit, 0))
 				return OPERATOR_CANCELLED;
@@ -1211,29 +1210,69 @@ static int delete_exec(bContext *C, wmOperator *op)
 			if (ef->pos <= 0)
 				return OPERATOR_CANCELLED;
 
-			for (x = ef->pos; x <= ef->len; x++)
-				ef->textbuf[x - 1] = ef->textbuf[x];
-			for (x = ef->pos; x <= ef->len; x++)
-				ef->textbufinfo[x - 1] = ef->textbufinfo[x];
+			range[0] = ef->pos - 1;
+			range[1] = ef->pos;
 
 			ef->pos--;
-			ef->textbuf[--ef->len] = '\0';
 			break;
 		case DEL_NEXT_CHAR:
 			if (ef->pos >= ef->len)
 				return OPERATOR_CANCELLED;
 
-			for (x = ef->pos; x < ef->len; x++)
-				ef->textbuf[x] = ef->textbuf[x + 1];
-			for (x = ef->pos; x < ef->len; x++)
-				ef->textbufinfo[x] = ef->textbufinfo[x + 1];
+			range[0] = ef->pos;
+			range[1] = ef->pos + 1;
+			break;
+		case DEL_NEXT_WORD:
+		{
+			int pos = ef->pos;
+			BLI_str_cursor_step_wchar(ef->textbuf, ef->len, &pos, STRCUR_DIR_NEXT, STRCUR_JUMP_DELIM, true);
+			range[0] = ef->pos;
+			range[1] = pos;
+			break;
+		}
 
-			ef->textbuf[--ef->len] = '\0';
+		case DEL_PREV_WORD:
+		{
+			int pos = ef->pos;
+			BLI_str_cursor_step_wchar(ef->textbuf, ef->len, &pos, STRCUR_DIR_PREV, STRCUR_JUMP_DELIM, true);
+			range[0] = pos;
+			range[1] = ef->pos;
+			ef->pos = pos;
 			break;
+		}
 		default:
 			return OPERATOR_CANCELLED;
 	}
 
+	if (range[0] != range[1]) {
+		BLI_assert(range[0] < range[1]);
+		int len_remove = range[1] - range[0];
+		int len_tail = ef->len - range[1];
+		if (has_select) {
+			for (int i = 0; i < 2; i++) {
+				int *sel = i ? &ef->selend : &ef->selstart;
+				if (*sel <= range[0]) {
+					/* pass */
+				}
+				else if (*sel >= range[1]) {
+					*sel -= len_remove;
+				}
+				else if (*sel < range[1]) {
+					/* pass */
+					*sel = range[0];
+				}
+			}
+		}
+
+		memmove(&ef->textbuf[range[0]], &ef->textbuf[range[1]], sizeof(*ef->textbuf) * len_tail);
+		memmove(&ef->textbufinfo[range[0]], &ef->textbufinfo[range[1]], sizeof(*ef->textbufinfo) * len_tail);
+
+		ef->len -= len_remove;
+		ef->textbuf[ef->len] = '\0';
+
+		BKE_vfont_select_clamp(obedit);
+	}
+
 	text_update_edited(C, obedit, FO_EDIT);
 
 	return OPERATOR_FINISHED;
@@ -1254,7 +1293,7 @@ void FONT_OT_delete(wmOperatorType *ot)
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
 	/* properties */
-	RNA_def_enum(ot->srna, "type", delete_type_items, DEL_ALL, "Type", "Which part of the text to delete");
+	RNA_def_enum(ot->srna, "type", delete_type_items, DEL_PREV_CHAR, "Type", "Which part of the text to delete");
 }
 
 /*********************** insert text operator *************************/
diff --git a/source/blender/editors/space_console/console_intern.h b/source/blender/editors/space_console/console_intern.h
index 5b016b77e9f..f523cf0d476 100644
--- a/source/blender/editors/space_console/console_intern.h
+++ b/source/blender/editors/space_console/console_intern.h
@@ -70,6 +70,6 @@ void CONSOLE_OT_select_set(struct wmOperatorType *ot);
 void CONSOLE_OT_select_word(struct wmOperatorType *ot);
 
 enum { LINE_BEGIN, LINE_END, PREV_CHAR, NEXT_CHAR, PREV_WORD, NEXT_WORD };
-enum { DEL_ALL, DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_NEXT_WORD, DEL_PREV_WORD, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };
+enum { DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_NEXT_WORD, DEL_PREV_WORD, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };
 
 #endif /* __CONSOLE_INTERN_H__ */



More information about the Bf-blender-cvs mailing list