[Bf-blender-cvs] [4e95a90] master: Add 'copy array' for rna buttons

Bastien Montagne noreply at git.blender.org
Tue Nov 1 15:00:31 CET 2016


Commit: 4e95a9069e6fcbbdac10898e83dce8f993eb6518
Author: Bastien Montagne
Date:   Tue Nov 1 14:59:12 2016 +0100
Branches: master
https://developer.blender.org/rB4e95a9069e6fcbbdac10898e83dce8f993eb6518

Add 'copy array' for rna buttons

ctrl-alt-c/v allows to copy/paste whole RNA array, e.g. location, rotation, etc., from UI buttons.

Request from Andy at the studio.

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

M	source/blender/editors/interface/interface_handlers.c

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

diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 0555529..f3eeadb 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -2219,7 +2219,7 @@ static void ui_but_drop(bContext *C, const wmEvent *event, uiBut *but, uiHandleB
 /* ******************* copy and paste ********************  */
 
 /* c = copy, v = paste */
-static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data, char mode)
+static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data, const char mode, const bool copy_array)
 {
 	int buf_paste_len = 0;
 	const char *buf_paste = "";
@@ -2255,6 +2255,46 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
 		if (but->poin == NULL && but->rnapoin.data == NULL) {
 			/* pass */
 		}
+		else if (copy_array && but->rnapoin.data && but->rnaprop &&
+		         ELEM(RNA_property_subtype(but->rnaprop), PROP_COLOR, PROP_TRANSLATION, PROP_DIRECTION,
+		              PROP_VELOCITY, PROP_ACCELERATION, PROP_MATRIX, PROP_EULER, PROP_QUATERNION, PROP_AXISANGLE,
+		              PROP_XYZ, PROP_XYZ_LENGTH, PROP_COLOR_GAMMA, PROP_COORDS))
+		{
+			float values[4];
+			int array_length = RNA_property_array_length(&but->rnapoin, but->rnaprop);
+
+			if (mode == 'c') {
+				char buf_copy[UI_MAX_DRAW_STR];
+
+				if (array_length == 4) {
+					 values[3] = RNA_property_float_get_index(&but->rnapoin, but->rnaprop, 3);
+				}
+				else {
+					values[3] = 0.0f;
+				}
+				ui_but_v3_get(but, values);
+
+				BLI_snprintf(buf_copy, sizeof(buf_copy), "[%f, %f, %f, %f]", values[0], values[1], values[2], values[3]);
+				WM_clipboard_text_set(buf_copy, 0);
+			}
+			else {
+				if (sscanf(buf_paste, "[%f, %f, %f, %f]", &values[0], &values[1], &values[2], &values[3]) >= array_length) {
+					button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
+
+					ui_but_v3_set(but, values);
+					if (but->rnaprop && array_length == 4) {
+						RNA_property_float_set_index(&but->rnapoin, but->rnaprop, 3, values[3]);
+					}
+					data->value = values[but->rnaindex];
+
+					button_activate_state(C, but, BUTTON_STATE_EXIT);
+				}
+				else {
+					WM_report(RPT_ERROR, "Paste expected 4 numbers, formatted: '[n, n, n, n]'");
+					show_report = true;
+				}
+			}
+		}
 		else if (mode == 'c') {
 			/* Get many decimal places, then strip trailing zeros.
 			 * note: too high values start to give strange results */
@@ -6965,7 +7005,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
 	if ((data->state == BUTTON_STATE_HIGHLIGHT) || (event->type == EVT_DROP)) {
 		/* handle copy-paste */
 		if (ELEM(event->type, CKEY, VKEY) && event->val == KM_PRESS &&
-		    IS_EVENT_MOD(event, ctrl, oskey) && !event->shift && !event->alt)
+		    IS_EVENT_MOD(event, ctrl, oskey) && !event->shift)
 		{
 			/* Specific handling for listrows, we try to find their overlapping tex button. */
 			if (but->type == UI_BTYPE_LISTROW) {
@@ -6975,7 +7015,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
 					data = but->active;
 				}
 			}
-			ui_but_copy_paste(C, but, data, (event->type == CKEY) ? 'c' : 'v');
+			ui_but_copy_paste(C, but, data, (event->type == CKEY) ? 'c' : 'v', event->alt);
 			return WM_UI_HANDLER_BREAK;
 		}
 		/* handle drop */




More information about the Bf-blender-cvs mailing list