Add eyedropper for selecting object & obdata
In addition to the unlink icon to clear a value, When cleared, show an eyedropper to select objects or object-data (was already available via the EKey).
This commit is contained in:
parent
912397756a
commit
56a93e9cb1
Notes:
blender-bot
2023-02-14 11:34:36 +01:00
Referenced by issue #37521, Data Eyedropper has no User Interface Access
|
@ -37,6 +37,7 @@
|
|||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_screen_types.h"
|
||||
#include "DNA_userdef_types.h"
|
||||
|
@ -1951,6 +1952,45 @@ uiBut *ui_but_drag_multi_edit_get(uiBut *but)
|
|||
return but_iter;
|
||||
}
|
||||
|
||||
/** \name Check to show extra icons
|
||||
*
|
||||
* Extra icons are shown on the right hand side of buttons.
|
||||
* \{ */
|
||||
|
||||
static bool ui_but_icon_extra_is_visible_search_unlink(const uiBut *but)
|
||||
{
|
||||
BLI_assert(but->type == UI_BTYPE_SEARCH_MENU);
|
||||
return ((but->editstr == NULL) &&
|
||||
(but->drawstr[0] != '\0') &&
|
||||
(but->flag & UI_BUT_SEARCH_UNLINK));
|
||||
}
|
||||
|
||||
static bool ui_but_icon_extra_is_visible_eyedropper(uiBut *but)
|
||||
{
|
||||
StructRNA *type = RNA_property_pointer_type(&but->rnapoin, but->rnaprop);
|
||||
const short idcode = RNA_type_to_ID_code(type);
|
||||
|
||||
BLI_assert(but->type == UI_BTYPE_SEARCH_MENU && (but->flag & UI_BUT_SEARCH_UNLINK));
|
||||
|
||||
return ((but->editstr == NULL) &&
|
||||
(idcode == ID_OB || OB_DATA_SUPPORT_ID(idcode)));
|
||||
}
|
||||
|
||||
uiButExtraIconType ui_but_icon_extra_get(uiBut *but)
|
||||
{
|
||||
if (ui_but_icon_extra_is_visible_search_unlink(but)) {
|
||||
return UI_BUT_ICONEXTRA_UNLINK;
|
||||
}
|
||||
else if (ui_but_icon_extra_is_visible_eyedropper(but)) {
|
||||
return UI_BUT_ICONEXTRA_EYEDROPPER;
|
||||
}
|
||||
|
||||
return UI_BUT_ICONEXTRA_NONE;
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
|
||||
static double ui_get_but_scale_unit(uiBut *but, double value)
|
||||
{
|
||||
UnitSettings *unit = but->block->unit;
|
||||
|
|
|
@ -456,6 +456,8 @@ static void datadropper_exit(bContext *C, wmOperator *op)
|
|||
|
||||
op->customdata = NULL;
|
||||
}
|
||||
|
||||
WM_event_add_mousemove(C);
|
||||
}
|
||||
|
||||
static void datadropper_cancel(bContext *C, wmOperator *op)
|
||||
|
|
|
@ -3301,9 +3301,11 @@ static int ui_do_but_TEX(bContext *C, uiBlock *block, uiBut *but, uiHandleButton
|
|||
|
||||
static int ui_do_but_SEARCH_UNLINK(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
|
||||
{
|
||||
uiButExtraIconType extra_icon_type;
|
||||
|
||||
/* unlink icon is on right */
|
||||
if (ELEM(event->type, LEFTMOUSE, EVT_BUT_OPEN, PADENTER, RETKEY) && event->val == KM_PRESS &&
|
||||
ui_but_is_search_unlink_visible(but))
|
||||
if ((ELEM(event->type, LEFTMOUSE, EVT_BUT_OPEN, PADENTER, RETKEY)) &&
|
||||
((extra_icon_type = ui_but_icon_extra_get(but)) != UI_BUT_ICONEXTRA_NONE))
|
||||
{
|
||||
ARegion *ar = data->region;
|
||||
rcti rect;
|
||||
|
@ -3314,14 +3316,29 @@ static int ui_do_but_SEARCH_UNLINK(bContext *C, uiBlock *block, uiBut *but, uiHa
|
|||
BLI_rcti_rctf_copy(&rect, &but->rect);
|
||||
|
||||
rect.xmin = rect.xmax - (BLI_rcti_size_y(&rect));
|
||||
/* handle click on unlink/eyedropper icon */
|
||||
if (BLI_rcti_isect_pt(&rect, x, y)) {
|
||||
/* most likely NULL, but let's check, and give it temp zero string */
|
||||
if (data->str == NULL)
|
||||
data->str = MEM_callocN(1, "temp str");
|
||||
data->str[0] = 0;
|
||||
/* doing this on KM_PRESS calls eyedropper after clicking unlink icon */
|
||||
if (event->val == KM_RELEASE) {
|
||||
/* unlink */
|
||||
if (extra_icon_type == UI_BUT_ICONEXTRA_UNLINK) {
|
||||
/* most likely NULL, but let's check, and give it temp zero string */
|
||||
if (data->str == NULL) {
|
||||
data->str = MEM_callocN(1, "temp str");
|
||||
}
|
||||
data->str[0] = 0;
|
||||
|
||||
ui_apply_but_TEX(C, but, data);
|
||||
button_activate_state(C, but, BUTTON_STATE_EXIT);
|
||||
ui_apply_but_TEX(C, but, data);
|
||||
button_activate_state(C, but, BUTTON_STATE_EXIT);
|
||||
}
|
||||
/* eyedropper */
|
||||
else if (extra_icon_type == UI_BUT_ICONEXTRA_EYEDROPPER) {
|
||||
WM_operator_name_call(C, "UI_OT_eyedropper_id", WM_OP_INVOKE_DEFAULT, NULL);
|
||||
}
|
||||
else {
|
||||
BLI_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
return WM_UI_HANDLER_BREAK;
|
||||
}
|
||||
|
@ -6861,14 +6878,6 @@ static bool ui_but_is_interactive(const uiBut *but, const bool labeledit)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ui_but_is_search_unlink_visible(const uiBut *but)
|
||||
{
|
||||
BLI_assert(but->type == UI_BTYPE_SEARCH_MENU);
|
||||
return ((but->editstr == NULL) &&
|
||||
(but->drawstr[0] != '\0') &&
|
||||
(but->flag & UI_BUT_SEARCH_UNLINK));
|
||||
}
|
||||
|
||||
/* x and y are only used in case event is NULL... */
|
||||
static uiBut *ui_but_find_mouse_over_ex(ARegion *ar, const int x, const int y, const bool labeledit)
|
||||
{
|
||||
|
|
|
@ -121,6 +121,14 @@ enum {
|
|||
/* warn: rest of uiBut->flag in UI_interface.h */
|
||||
};
|
||||
|
||||
/* some buttons display icons only under special conditions
|
||||
* (e.g. 'x' icon in search menu) - used with ui_but_icon_extra_get */
|
||||
typedef enum uiButExtraIconType {
|
||||
UI_BUT_ICONEXTRA_NONE = 1,
|
||||
UI_BUT_ICONEXTRA_UNLINK,
|
||||
UI_BUT_ICONEXTRA_EYEDROPPER,
|
||||
} uiButExtraIconType;
|
||||
|
||||
/* but->pie_dir */
|
||||
typedef enum RadialDirection {
|
||||
UI_RADIAL_NONE = -1,
|
||||
|
@ -456,6 +464,7 @@ extern bool ui_but_string_set(struct bContext *C, uiBut *but, const char *str) A
|
|||
extern bool ui_but_string_set_eval_num(struct bContext *C, uiBut *but, const char *str, double *value) ATTR_NONNULL();
|
||||
extern int ui_but_string_get_max_length(uiBut *but);
|
||||
extern uiBut *ui_but_drag_multi_edit_get(uiBut *but);
|
||||
extern uiButExtraIconType ui_but_icon_extra_get(uiBut *but);
|
||||
|
||||
extern void ui_but_default_set(struct bContext *C, const bool all, const bool use_afterfunc);
|
||||
|
||||
|
@ -466,7 +475,6 @@ extern bool ui_but_is_unit(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
|
|||
extern bool ui_but_is_compatible(const uiBut *but_a, const uiBut *but_b) ATTR_WARN_UNUSED_RESULT;
|
||||
extern bool ui_but_is_rna_valid(uiBut *but) ATTR_WARN_UNUSED_RESULT;
|
||||
extern bool ui_but_is_utf8(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
|
||||
extern bool ui_but_is_search_unlink_visible(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
|
||||
|
||||
extern int ui_but_is_pushed_ex(uiBut *but, double *value) ATTR_WARN_UNUSED_RESULT;
|
||||
extern int ui_but_is_pushed(uiBut *but) ATTR_WARN_UNUSED_RESULT;
|
||||
|
|
|
@ -1501,6 +1501,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
|
|||
const bool show_menu_icon = ui_but_draw_menu_icon(but);
|
||||
float alpha = (float)wcol->text[3] / 255.0f;
|
||||
char password_str[UI_MAX_DRAW_STR];
|
||||
uiButExtraIconType extra_icon_type;
|
||||
|
||||
ui_but_text_password_hide(password_str, but, false);
|
||||
|
||||
|
@ -1540,11 +1541,23 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
|
|||
}
|
||||
|
||||
/* unlink icon for this button type */
|
||||
if ((but->type == UI_BTYPE_SEARCH_MENU) && ui_but_is_search_unlink_visible(but)) {
|
||||
if ((but->type == UI_BTYPE_SEARCH_MENU) &&
|
||||
((extra_icon_type = ui_but_icon_extra_get(but)) != UI_BUT_ICONEXTRA_NONE))
|
||||
{
|
||||
rcti temp = *rect;
|
||||
|
||||
temp.xmin = temp.xmax - (BLI_rcti_size_y(rect) * 1.08f);
|
||||
widget_draw_icon(but, ICON_X, alpha, &temp, false);
|
||||
|
||||
if (extra_icon_type == UI_BUT_ICONEXTRA_UNLINK) {
|
||||
widget_draw_icon(but, ICON_X, alpha, &temp, false);
|
||||
}
|
||||
else if (extra_icon_type == UI_BUT_ICONEXTRA_EYEDROPPER) {
|
||||
widget_draw_icon(but, ICON_EYEDROPPER, alpha, &temp, false);
|
||||
}
|
||||
else {
|
||||
BLI_assert(0);
|
||||
}
|
||||
|
||||
rect->xmax -= ICON_SIZE_FROM_BUTRECT(rect);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue