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.
This commit is contained in:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user