From 916d9018d4278f334fba0c12d3eb03a66aabe3ff Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Thu, 25 May 2023 13:53:38 +0200 Subject: [PATCH 1/3] Fix #108096: UI: copy-paste array buttons can change source properties Pasting numerical array buttons happens with `Ctrl + Alt + V`. Holding `Alt` also triggers uiSelectContext, so having other nodes/ objects etc. selected while doing this would try to copy the pasted values back to other objects (possibly to the ones you pasted from) and that happens relative to the original value, so the value actually changes. To prevent the "copy-to-selected" behavior, check for the specific button combination in `ui_apply_but` and skip it in that case. --- .../editors/interface/interface_handlers.cc | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/interface/interface_handlers.cc b/source/blender/editors/interface/interface_handlers.cc index 1dcf0b399be..f8f993d07b8 100644 --- a/source/blender/editors/interface/interface_handlers.cc +++ b/source/blender/editors/interface/interface_handlers.cc @@ -2248,10 +2248,17 @@ static void ui_apply_but( if (data->select_others.elems_len == 0) { wmWindow *win = CTX_wm_window(C); - /* may have been enabled before activating */ - if (data->select_others.is_enabled || IS_ALLSELECT_EVENT(win->eventstate)) { - ui_selectcontext_begin(C, but, &data->select_others); - data->select_others.is_enabled = true; + wmEvent *event = win->eventstate; + /* May have been enabled before activating, dont do for array pasting. */ + if (data->select_others.is_enabled || IS_ALLSELECT_EVENT(event)) { + const bool is_array_paste = (event->val == KM_PRESS) && + (event->modifier & (KM_CTRL | KM_OSKEY)) && + (event->modifier & KM_SHIFT) == 0 && + (event->type == EVT_VKEY); + if (!is_array_paste) { + ui_selectcontext_begin(C, but, &data->select_others); + data->select_others.is_enabled = true; + } } } if (data->select_others.elems_len == 0) { -- 2.30.2 From b27578b75884c47003e2abec275bbc13c516c6e4 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Thu, 1 Jun 2023 15:16:40 +0200 Subject: [PATCH 2/3] tweak event handling make IS_ALLSELECT_EVENT more specific in regards to events which are expected to be used for multi button editing (instead of checking the events for array pasting specifically) --- .../editors/interface/interface_handlers.cc | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/source/blender/editors/interface/interface_handlers.cc b/source/blender/editors/interface/interface_handlers.cc index f8f993d07b8..60f5d5f9a6b 100644 --- a/source/blender/editors/interface/interface_handlers.cc +++ b/source/blender/editors/interface/interface_handlers.cc @@ -276,7 +276,9 @@ static void ui_selectcontext_apply(bContext *C, const double value, const double value_orig); -# define IS_ALLSELECT_EVENT(event) (((event)->modifier & KM_ALT) != 0) +# define IS_ALLSELECT_EVENT(event) \ + (((event)->modifier & KM_ALT) != 0 && \ + (ISMOUSE((event)->type) || ELEM((event)->type, EVT_RETKEY, EVT_PADENTER))) /** just show a tinted color so users know its activated */ # define UI_BUT_IS_SELECT_CONTEXT UI_BUT_NODE_ACTIVE @@ -2248,17 +2250,10 @@ static void ui_apply_but( if (data->select_others.elems_len == 0) { wmWindow *win = CTX_wm_window(C); - wmEvent *event = win->eventstate; - /* May have been enabled before activating, dont do for array pasting. */ - if (data->select_others.is_enabled || IS_ALLSELECT_EVENT(event)) { - const bool is_array_paste = (event->val == KM_PRESS) && - (event->modifier & (KM_CTRL | KM_OSKEY)) && - (event->modifier & KM_SHIFT) == 0 && - (event->type == EVT_VKEY); - if (!is_array_paste) { - ui_selectcontext_begin(C, but, &data->select_others); - data->select_others.is_enabled = true; - } + /* may have been enabled before activating */ + if (data->select_others.is_enabled || IS_ALLSELECT_EVENT(win->eventstate)) { + ui_selectcontext_begin(C, but, &data->select_others); + data->select_others.is_enabled = true; } } if (data->select_others.elems_len == 0) { -- 2.30.2 From 3b71b14904e06a1aaf40144ddb2fd5a82c3b11df Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Wed, 7 Jun 2023 11:11:28 +0200 Subject: [PATCH 3/3] add comment --- source/blender/editors/interface/interface_handlers.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blender/editors/interface/interface_handlers.cc b/source/blender/editors/interface/interface_handlers.cc index 60f5d5f9a6b..660b3f718da 100644 --- a/source/blender/editors/interface/interface_handlers.cc +++ b/source/blender/editors/interface/interface_handlers.cc @@ -276,6 +276,10 @@ static void ui_selectcontext_apply(bContext *C, const double value, const double value_orig); +/** + * Only respond to events which are expected to be used for multi button editing, + * e.g. ALT is also used for button array pasting, see #108096. + */ # define IS_ALLSELECT_EVENT(event) \ (((event)->modifier & KM_ALT) != 0 && \ (ISMOUSE((event)->type) || ELEM((event)->type, EVT_RETKEY, EVT_PADENTER))) -- 2.30.2