72#include "RNA_prototypes.hh"
98#define USE_CONT_MOUSE_CORRECT
100#define USE_DRAG_TOGGLE
103#define USE_DRAG_MULTINUM
112#define USE_KEYNAV_LIMIT
115#define USE_DRAG_POPUP
127#define UI_MAX_PASSWORD_STR 128
139#define UI_PROP_SCALE_LOG_MIN 0.5e-8f
145#define UI_PROP_SCALE_LOG_SNAP_OFFSET 0.03f
158#define UI_DRAG_MAP_SOFT_RANGE_PIXEL_MAX 1000
177 const bool is_click);
180 const bool is_click);
188#ifdef USE_KEYNAV_LIMIT
205#define BUTTON_FLASH_DELAY 0.020
206#define MENU_SCROLL_INTERVAL 0.1
207#define PIE_MENU_INTERVAL 0.01
208#define BUTTON_AUTO_OPEN_THRESH 0.2
209#define BUTTON_MOUSE_TOWARDS_THRESH 1.0
211#define BUTTON_KEYNAV_PX_LIMIT 8
214#define MENU_TOWARDS_MARGIN 20
216#define MENU_TOWARDS_WIGGLE_ROOM 64
264# define USE_ALLSELECT_LAYER_HACK
292 const double value_orig);
300# define IS_ALLSELECT_EVENT(event) (((event)->modifier & KM_ALT) != 0)
303# define UI_BUT_IS_SELECT_CONTEXT UI_BUT_NODE_ACTIVE
307#ifdef USE_DRAG_MULTINUM
312# define DRAG_MULTINUM_THRESHOLD_DRAG_X (UI_UNIT_Y / 4)
319# define DRAG_MULTINUM_THRESHOLD_DRAG_Y (UI_UNIT_Y / 4)
329# define DRAG_MULTINUM_THRESHOLD_VERTICAL (0.75f)
468#ifdef USE_CONT_MOUSE_CORRECT
481#ifdef USE_KEYNAV_LIMIT
485#ifdef USE_DRAG_MULTINUM
567#ifdef USE_DRAG_MULTINUM
605 static int lastdy = 0;
613 if ((dy > 0 && lastdy < 0) || (dy < 0 && lastdy > 0)) {
645 uiBut *but_found =
nullptr;
656 but_found = block->
buttons[
i].get();
657 if (direction == 1) {
669 return shift ? 0.05f : 1.0f;
682 *r_mx = (
data->dragstartx * (1.0f - fac) + mx * fac);
683 *r_my = (
data->dragstarty * (1.0f - fac) + my * fac);
692#ifdef USE_DRAG_MULTINUM
695 const bool initializing =
ELEM(
700 return (initializing && vertical_dragging);
711 if (
data->draglock) {
712 const int threshold = drag_threshold_fn();
713 if (
abs(mx -
data->dragstartx) < threshold) {
716#ifdef USE_DRAG_MULTINUM
722 data->draglock =
false;
723 data->dragstartx = mx;
741 if (base ==
nullptr) {
745 bool is_userdef =
false;
747 &RNA_AddonPreferences,
748 &RNA_KeyConfigPreferences,
750 &RNA_UserAssetLibrary))
754 else if (
ptr->owner_id) {
755 switch (
GS(
ptr->owner_id->name)) {
770 else if (
ptr->owner_id ==
nullptr) {
791 U.runtime.is_dirty =
true;
834 *r_hue =
roundf((*r_hue) * snap_increment) / snap_increment;
847 uiAfterFunc *after = MEM_new<uiAfterFunc>(__func__);
870 const uiBut *context_but)
877 after->
opptr = *properties;
878 *properties =
nullptr;
881 if (context_but && context_but->
context) {
967 but->
opptr =
nullptr;
978 search_but->
arg =
nullptr;
981 if (but->
active !=
nullptr) {
983 if (
data->custom_interaction_handle !=
nullptr) {
1022 std::optional<StringRef>
str;
1023 size_t str_len_clip =
SIZE_MAX - 1;
1024 bool skip_undo =
false;
1033 else if (!but->
drawstr.empty()) {
1043 if (!
str ||
str->is_empty() || str_len_clip == 0) {
1044 str =
"Unknown Action";
1045 str_len_clip =
str->size();
1054 if (
ELEM(but->
rnaprop, &rna_ID_name, &rna_Object_active_shape_key_index)) {
1067 if (skip_undo ==
false) {
1104 if (!
str.has_value()) {
1133 opptr = *after.
opptr;
1134 MEM_delete(after.
opptr);
1141 (after.
opptr) ? &opptr :
nullptr,
1219 data->applied =
true;
1228 data->applied =
true;
1240 data->applied =
true;
1251 value_toggle = (value == 0.0);
1262 data->applied =
true;
1272 for (
const std::unique_ptr<uiBut> &bt : block->
buttons) {
1280 data->applied =
true;
1288 if (
data->apply_through_extra_icon) {
1298 if (!
data->text_edit.edit_string) {
1317 data->text_edit.original_string =
nullptr;
1337 data->applied =
true;
1342 if (
data->text_edit.edit_string) {
1352 data->applied =
true;
1357 if (
data->text_edit.edit_string) {
1370 data->cancel =
true;
1379 data->cancel =
true;
1391 data->applied =
true;
1401 data->applied =
true;
1408 data->applied =
true;
1415 data->applied =
true;
1422 data->applied =
true;
1431#ifdef USE_DRAG_MULTINUM
1440 mbut_state->
but = but;
1442# ifdef USE_ALLSELECT
1456 if (mbut_state->
but == but) {
1466 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
1472# ifdef USE_ALLSELECT
1490# ifdef USE_ALLSELECT
1491 if (
data->multi_data.mbuts) {
1496 MEM_delete(mbut_state);
1505 data->multi_data.mbuts =
nullptr;
1507 if (
data->multi_data.bs_mbuts) {
1509 data->multi_data.bs_mbuts =
nullptr;
1518 bool changed =
false;
1520 seg[0][0] =
data->multi_data.drag_start[0];
1521 seg[0][1] =
data->multi_data.drag_start[1];
1523 seg[1][0] =
event->xy[0];
1524 seg[1][1] =
event->xy[1];
1531 data->multi_data.has_mbuts =
false;
1534 for (
const std::unique_ptr<uiBut> &but : but_active->
block->
buttons) {
1535 bool drag_prev =
false;
1536 bool drag_curr =
false;
1547 if (but_active != but.get()) {
1556 data->multi_data.has_mbuts =
true;
1563 changed |= (drag_prev != drag_curr);
1576 for (
const std::unique_ptr<uiBut> &but : but_active->
block->
buttons) {
1588 if (
data->origvalue != 0.0) {
1589 data->multi_data.is_proportional =
true;
1597 const double value_delta =
data->value -
data->origvalue;
1598 const double value_scale =
data->multi_data.is_proportional ? (
data->value /
data->origvalue) :
1604 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
1611 if (mbut_state ==
nullptr) {
1622# ifdef USE_ALLSELECT
1623 if (
data->select_others.is_enabled) {
1634 but->active->origvalue = mbut_state->
origvalue;
1636 but->active->select_others.do_free =
false;
1641 if (
data->text_edit.edit_string) {
1643 but->active->value =
data->value;
1648 if (
data->multi_data.is_proportional) {
1649 but->active->value = mbut_state->
origvalue * value_scale;
1652 but->active->value = mbut_state->
origvalue + value_delta;
1656 CLAMP(but->active->value,
double(but->softmin),
double(but->softmax));
1671#ifdef USE_DRAG_TOGGLE
1719 bContext *
C,
ARegion *region,
const int pushed_state,
const int xy_src[2],
const int xy_dst[2])
1723 bool changed =
false;
1726 float xy_a_block[2] = {
float(xy_src[0]),
float(xy_src[1])};
1727 float xy_b_block[2] = {
float(xy_dst[0]),
float(xy_dst[1])};
1732 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
1747 if (pushed_state_but == pushed_state) {
1756 if (
U.runtime.is_dirty ==
false) {
1774 bool do_draw =
false;
1788 const float but_cent_new[2] = {
1815 xy[0] = (drag_info->
xy_lock[0] ==
false) ? xy_input[0] : drag_info->
xy_last[0];
1816 xy[1] = (drag_info->
xy_lock[1] ==
false) ? xy_input[1] : drag_info->
xy_last[1];
1839 switch (event->
type) {
1859 region, drag_info->
xy_init,
true,
false,
nullptr,
nullptr);
1893 bool success =
false;
1907 if (
ptr.data && prop) {
1908 bool use_path_from_id;
1914 std::optional<std::string> path;
1926 path.has_value() ? path->c_str() :
nullptr,
1997 const double value_orig)
2003 const bool use_delta = (selctx_data->
is_copy ==
false);
2005 std::variant<bool, int, float, std::string, PointerRNA> delta,
min,
max;
2011 delta.emplace<
float>(use_delta ? (value - value_orig) : value);
2014 min.emplace<
float>(min_v);
2015 max.emplace<
float>(max_v);
2018 delta.emplace<
int>(int(use_delta ? (value - value_orig) : value));
2021 min.emplace<
int>(min_v);
2022 max.emplace<
int>(max_v);
2047# ifdef USE_ALLSELECT_LAYER_HACK
2061 tmparray[index] =
true;
2081 float other_value = std::get<float>(delta) + (use_delta ? other.
val_f : 0.0f);
2082 CLAMP(other_value, std::get<float>(
min), std::get<float>(
max));
2091 int other_value = std::get<int>(delta) + (use_delta ? other.
val_i : 0);
2092 CLAMP(other_value, std::get<int>(
min), std::get<int>(
max));
2101 const bool other_value = std::get<bool>(delta);
2110 const int other_value = std::get<int>(delta);
2115 const PointerRNA &other_value = std::get<PointerRNA>(delta);
2119 const std::string &other_value = std::get<std::string>(delta);
2146 const int drag_threshold =
min_ii(
2150 if (
abs(
data->dragstartx - event->
xy[0]) +
abs(
data->dragstarty - event->
xy[1]) > drag_threshold)
2153 data->cancel =
true;
2154#ifdef USE_DRAG_TOGGLE
2174 &
data->window->modalhandlers,
2200 if (lock_axis != -1) {
2201 drag_info->
xy_lock[lock_axis] =
true;
2266 data->applied =
true;
2273 data->applied =
true;
2280 data->applied =
true;
2287 data->applied =
true;
2300 if (!
data->applied) {
2304 if (
data->text_edit.edit_string) {
2307 data->text_edit.edit_string =
data->text_edit.original_string;
2308 data->text_edit.original_string =
nullptr;
2317 data->applied_interactive =
true;
2319 else if (
data->applied_interactive) {
2324# ifdef USE_DRAG_MULTINUM
2330 if (
data->select_others.elems.is_empty())
2337 const bool is_array_paste = (
event->val ==
KM_PRESS) &&
2340 if (!is_array_paste) {
2342 data->select_others.is_enabled =
true;
2346 if (
data->select_others.elems.is_empty()) {
2348 data->select_others.elems.clear();
2355 double *editval = but->
editval;
2356 float *editvec = but->
editvec;
2474#ifdef USE_DRAG_MULTINUM
2475 if (
data->multi_data.has_mbuts) {
2477 (
data->multi_data.skip ==
false))
2494 data->origvalue = 0.0;
2514 if (
data->custom_interaction_handle !=
nullptr) {
2535 *r_buf_paste = text;
2569 const int values_len,
2573 const int values_end = values_len - 1;
2576 for (
int i = 0;
i < values_len;
i++) {
2578 output + ofs, output_maxncpy - ofs, (
i != values_end) ?
"%f, " :
"%f]", values[
i]);
2593 BLI_assert(0 <= values_len_expected && values_len_expected <= 4);
2596 const int values_len_actual = sscanf(
2597 text,
"[%f, %f, %f, %f, %f]", &
v[0], &
v[1], &
v[2], &
v[3], &
v[4]);
2599 if (values_len_actual == values_len_expected) {
2600 memcpy(values,
v,
sizeof(
float) * values_len_expected);
2612 if (values_len > 4) {
2643 data->value = value;
2725 if (but->
poin !=
nullptr) {
2741 if (but->
poin !=
nullptr) {
2760 if (but->
poin !=
nullptr) {
2813 char buf[4096] = {0};
2814 const int buf_maxncpy =
sizeof(buf);
2817 bool is_buf_set =
false;
2819 const bool has_required_data = !(but->
poin ==
nullptr && but->
rnapoin.
data ==
nullptr);
2821 switch (but->
type) {
2824 if (!has_required_data) {
2837 if (!has_required_data) {
2845 if (!has_required_data) {
2854 if (!has_required_data) {
2907 int buf_paste_len = 0;
2911 const bool has_required_data = !(but->
poin ==
nullptr && but->
rnapoin.
data ==
nullptr);
2913 switch (but->
type) {
2916 if (!has_required_data) {
2928 if (!has_required_data) {
2935 if (!has_required_data) {
2943 if (!has_required_data) {
2992 const char *strpos = butstr;
2993 const char *str_end = butstr + strlen(butstr);
2994 for (
int i = 0;
i <
pos;
i++) {
2998 return (strpos - butstr);
3022 if (but->
pos >= 0) {
3033 if (but->
pos >= 0) {
3041 memset(butstr,
'*',
len);
3115 const int len = strlen(
str);
3116 bool changed =
false;
3145 float starty_dummy = 0.0f;
3163 startx -=
U.pixelsize / aspect;
3172 str_last = &
str[but->
ofs];
3220 bool changed =
false;
3228 size_t step = buf_len;
3248 memcpy(&
str[but->
pos], buf,
step *
sizeof(
char));
3257#ifdef WITH_INPUT_IME
3261 const char buf[2] = {ascii,
'\0'};
3273 const int len = strlen(
str);
3274 const int pos_prev = but->
pos;
3280 if (has_sel && !
select) {
3295 int pos_i = but->
pos;
3300 if (has_sel ==
false) {
3305 else if (but->
selsta == pos_prev) {
3326 const int len = strlen(
str);
3328 bool changed =
false;
3337 else if (direction) {
3341 else if (but->
pos >= 0 && but->
pos <
len) {
3355 else if (but->
pos > 0) {
3373 char *
str =
data->text_edit.edit_string;
3376 if (
data->searchbox) {
3398 bool changed =
false;
3437#ifdef WITH_INPUT_IME
3451 wm_window_IME_begin(win,
x,
y, 0, 0,
true);
3457 wm_window_IME_end(win);
3460void ui_but_ime_reposition(
uiBut *but,
int x,
int y,
bool complete)
3466 wm_window_IME_begin(
data->window,
x,
y - 4, 0, 0, complete);
3469const wmIMEData *ui_but_ime_data_get(
uiBut *but)
3473 if (
data &&
data->window &&
data->window->runtime->ime_data_is_composing) {
3474 return data->window->runtime->ime_data;
3485 bool no_zero_strip =
false;
3491#if defined(__APPLE__)
3492 const int ctrl_icon = ICON_KEY_COMMAND;
3494 const int ctrl_icon = ICON_EVENT_CTRL;
3501 status.item(
IFACE_(
"Select All"), ctrl_icon, ICON_EVENT_A);
3510#ifdef USE_DRAG_MULTINUM
3512 if (
data->applied_interactive) {
3514 data->cancel =
true;
3516 data->cancel =
false;
3518 data->applied_interactive =
false;
3525 data->select_others.is_enabled =
true;
3526 data->select_others.is_copy =
true;
3597 if (
data->searchbox) {
3617#ifdef WITH_INPUT_IME
3619 ui_textedit_ime_begin(win, but);
3644 if (
data->searchbox) {
3645 if (
data->cancel ==
false) {
3659 data->cancel =
true;
3662 data->escapecancel =
true;
3670 data->searchbox =
nullptr;
3686#ifdef WITH_INPUT_IME
3692 ui_textedit_ime_end(win, but);
3714 data->postbut = but;
3720 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
3721 if (but.get() == actbut) {
3726 data->postbut = but.get();
3747 for (
int i = block->
but_index(actbut) - 1;
i >= 0;
i--) {
3751 data->postbut = but;
3759 if (but == actbut) {
3764 data->postbut = but;
3777#if defined(__APPLE__)
3797 bool changed =
false, inbox =
false,
update =
false, skip_undo_push =
false;
3799#ifdef WITH_INPUT_IME
3801 const wmIMEData *ime_data = win->
runtime->ime_data;
3802 const bool is_ime_composing = ime_data && win->
runtime->ime_data_is_composing;
3804 const bool is_ime_composing =
false;
3807 switch (event->
type) {
3810 if (
data->searchbox) {
3811#ifdef USE_KEYNAV_LIMIT
3830 if (
data->is_semi_modal) {
3836 if (
data->searchbox) {
3844#ifdef WITH_INPUT_IME
3846 if (is_ime_composing) {
3850 data->cancel =
true;
3851 data->escapecancel =
true;
3866 if (
data->searchbox) {
3870 bool is_press_in_button =
false;
3872 float mx =
event->xy[0];
3873 float my =
event->xy[1];
3877 is_press_in_button =
true;
3884 if (is_press_in_button) {
3892 else if (inbox ==
false && !
data->is_semi_modal) {
3894 if (
data->searchbox) {
3895 data->cancel =
data->escapecancel =
true;
3904 if (is_press_in_button) {
3905 const int str_len = strlen(text_edit.
edit_string);
3913 but->
pos = short(selend);
3914 but->
selsta = short(selsta);
3915 but->
selend = short(selend);
3917 text_edit.
sel_pos_init = ((selend == str_len) && (selsta != 0)) ? selend : selsta;
3922 else if (inbox && !
data->is_semi_modal) {
3937 if (event->
val ==
KM_PRESS && !is_ime_composing) {
3938 switch (event->
type) {
3942#if defined(__APPLE__)
3973 if (
data->searchbox) {
3974#ifdef USE_KEYNAV_LIMIT
3991 if (
data->searchbox) {
3992#ifdef USE_KEYNAV_LIMIT
4025#if defined(__APPLE__)
4063 const bool is_redo = (
event->modifier &
KM_SHIFT);
4065#
if defined(__APPLE__)
4073 if (undo_str !=
nullptr) {
4077 but->
pos = undo_pos;
4083 skip_undo_push =
true;
4093#ifdef WITH_INPUT_IME
4094 && !is_ime_composing && !WM_event_is_ime_switch(event)
4098 char utf8_buf_override[2] = {
'\0',
'\0'};
4099 const char *utf8_buf =
event->utf8_buf;
4105 utf8_buf_override[0] =
'.';
4106 utf8_buf = utf8_buf_override;
4124#ifdef WITH_INPUT_IME
4133 if (ime_data->result.size()) {
4135 STREQ(ime_data->result.c_str(),
"\xE3\x80\x82"))
4138 ui_textedit_insert_ascii(but,
data,
'.');
4152 if ((skip_undo_push ==
false) && (text_edit.
undo_stack_text !=
nullptr)) {
4165 if (
data->searchbox) {
4172 if (!
data->searchbox) {
4188 switch (event->
type) {
4190 int mx =
event->xy[0];
4191 int my =
event->xy[1];
4226 data->origvalue =
data->startvalue;
4257 float softrange = softmax - softmin;
4270 const float value_step_float_min = 0.1f;
4272 const double value_step = is_float ?
4276 const float softrange_max =
min_ff(
4278 2 * (is_float ?
min_ff(value_step, value_step_float_min) *
4279 (drag_map_softrange_max / value_step_float_min) :
4280 drag_map_softrange_max));
4282 if (softrange > softrange_max) {
4284 softmin =
data->origvalue - (softrange_max / 2);
4285 softmax =
data->origvalue + (softrange_max / 2);
4286 if (!isfinite(softmin)) {
4289 if (!isfinite(softmax)) {
4293 if (softmin < but->softmin) {
4295 softmax = softmin + softrange_max;
4297 else if (softmax > but->
softmax) {
4299 softmin = softmax - softrange_max;
4303 if (
UNLIKELY(softmin == softmax)) {
4304 if (
data->origvalue > 0.0) {
4305 softmin = nextafterf(softmin, -
FLT_MAX);
4308 softmax = nextafterf(softmax,
FLT_MAX);
4312 softrange = softmax - softmin;
4316 if (softrange == 0.0f) {
4317 data->dragfstart = 0.0f;
4320 switch (scale_type) {
4322 data->dragfstart = (
float(
data->value) - softmin) / softrange;
4327 const float base = softmax / log_min;
4332 const float cubic_min =
cube_f(softmin);
4333 const float cubic_max =
cube_f(softmax);
4334 const float cubic_range = cubic_max - cubic_min;
4335 const float f = (
float(
data->value) - softmin) * cubic_range / softrange + cubic_min;
4336 data->dragfstart = (cbrtf(f) - softmin) / softrange;
4343 data->drag_map_soft_min = softmin;
4344 data->drag_map_soft_max = softmax;
4347 data->dragchange =
false;
4348 data->draglock =
true;
4367 data->dragstartx = 0;
4368 data->draglastx = 0;
4369 data->dragchange =
false;
4370 data->dragcbd =
nullptr;
4376 if (
data->interactive) {
4422 PanelType *popover_panel_type =
nullptr;
4423 void *arg =
nullptr;
4428 status.item(
" ", ICON_NONE);
4431 switch (but->
type) {
4446 const char *idname =
static_cast<const char *
>(but->
func_argN);
4450 if (popover_panel_type) {
4461 popover_panel_type =
reinterpret_cast<PanelType *
>(but->
poin);
4469 const char *idname =
static_cast<const char *
>(but->
func_argN);
4473 if (popover_panel_type) {
4487 if (func || handlefunc) {
4489 C,
data->region, but, func, handlefunc, arg,
nullptr,
false);
4494 else if (menufunc) {
4503 else if (popoverfunc) {
4513 data->select_others.is_enabled =
true;
4541 data->menu =
nullptr;
4550 return data->menu->direction;
4571 data->cancel =
true;
4596 int x =
event->xy[0],
y =
event->xy[1];
4605 xmax -= 0.2 * icon_size;
4614 if ((
x > (xmax - icon_size)) &&
x <= xmax) {
4657 if (op_icon->highlighted) {
4658 old_highlighted = op_icon;
4669 if (old_highlighted != hovered) {
4674#ifdef USE_DRAG_TOGGLE
4683 data->dragstartx =
event->xy[0];
4684 data->dragstarty =
event->xy[1];
4692 data->applied =
false;
4702#ifdef USE_DRAG_TOGGLE
4719 data->cancel =
true;
4732 data->cancel =
true;
4776 data->cancel =
true;
4778 data->escapecancel =
true;
4796 data->cancel =
true;
4804 data->cancel =
true;
4805 data->escapecancel =
true;
4836 data->cancel =
true;
4849 const bool is_property = (but->
rnaprop !=
nullptr);
4851#ifdef USE_DRAG_TOGGLE
4872 if (event->
val == event_val) {
4897 const int inc_value)
4911 bool no_zero_strip =
false;
4912 if (str_maxncpy != 0) {
4921 if (but_string[0] ==
'\0') {
4936 if (
num == 0 && digits == 0) {
4991 const int inc_value = (
event->type ==
WHEELUPMOUSE) ? 1 : -1;
5021#ifdef USE_DRAG_TOGGLE
5031 bool do_activate =
false;
5068 int type =
event->type;
5069 int val =
event->val;
5088 data->cancel =
true;
5124 const bool close_popup =
true)
5153 switch (event->
val) {
5168 data->dragstartx =
event->xy[0];
5169 data->dragstarty =
event->xy[1];
5178 data->cancel =
true;
5207 data->dragstartx =
event->xy[0];
5208 data->dragstarty =
event->xy[1];
5212#ifdef USE_DRAG_TOGGLE
5215 data->dragstartx =
event->xy[0];
5216 data->dragstarty =
event->xy[1];
5264 if (tempf == softmin || tempf == softmax ||
snap ==
SNAP_OFF) {
5269 float softrange = softmax - softmin;
5295 if (softrange >= 21.0f) {
5307 switch (scale_type) {
5311 if (softrange < 2.10f) {
5312 tempf =
roundf(tempf * 10.0f / snap_fac) * 0.1f * snap_fac;
5314 else if (softrange < 21.0f) {
5315 tempf =
roundf(tempf / snap_fac) * snap_fac;
5318 tempf =
roundf(tempf * 0.1f / snap_fac) * 10.0f * snap_fac;
5323 const float snap_fac =
powf(10.0f,
5326 tempf =
roundf(tempf / snap_fac) * snap_fac;
5344 if (
ELEM(temp, softmin, softmax)) {
5352 temp = 10 * (temp / 10);
5355 temp = 100 * (temp / 100);
5366 const bool is_motion,
5372 bool changed =
false;
5377 if ((is_motion ||
data->draglock) &&
5387 const float softmin = but->
softmin;
5388 const float softmax = but->
softmax;
5389 const float softrange = softmax - softmin;
5400 switch (scale_type) {
5406 const float startvalue =
max_ff(
float(
data->startvalue), log_min);
5407 tempf =
expf(
float(mx -
data->dragstartx) * fac) * startvalue;
5408 if (tempf <= log_min) {
5414 tempf = cbrtf(
float(
data->startvalue)) +
float(mx -
data->dragstartx) * fac;
5415 tempf *= tempf * tempf;
5423 switch (scale_type) {
5425 if (tempf < softmin) {
5426 data->dragstartx -= (softmin - tempf) / fac;
5429 else if (tempf > softmax) {
5430 data->dragstartx -= (softmax - tempf) / fac;
5436 const float startvalue =
max_ff(
float(
data->startvalue), log_min);
5437 if (tempf < log_min) {
5438 data->dragstartx -=
logf(log_min / startvalue) / fac -
float(mx -
data->dragstartx);
5441 else if (tempf > softmax) {
5442 data->dragstartx -=
logf(softmax / startvalue) / fac -
float(mx -
data->dragstartx);
5448 if (tempf < softmin) {
5449 data->dragstartx = mx - int((cbrtf(softmin) - cbrtf(
float(
data->startvalue))) / fac);
5452 else if (tempf > softmax) {
5453 data->dragstartx = mx - int((cbrtf(softmax) - cbrtf(
float(
data->startvalue))) / fac);
5460 CLAMP(tempf, softmin, softmax);
5463 if (tempf !=
float(
data->value)) {
5464 data->dragchange =
true;
5465 data->value = tempf;
5470 if (softrange > 256) {
5473 else if (softrange > 32) {
5480 temp =
data->startvalue + ((double(mx) -
data->dragstartx) * double(fac));
5484 if (temp < softmin) {
5485 data->dragstartx -= (softmin - temp) / fac;
5488 else if (temp > softmax) {
5489 data->dragstartx += (temp - softmax) / fac;
5493 CLAMP(temp, softmin, softmax);
5496 if (temp !=
data->value) {
5497 data->dragchange =
true;
5503 data->draglastx = mx;
5507 const float softmin =
data->drag_map_soft_min;
5508 const float softmax =
data->drag_map_soft_max;
5509 const float softrange = softmax - softmin;
5511 float non_linear_range_limit;
5512 float non_linear_pixel_map;
5513 float non_linear_scale;
5520 non_linear_range_limit = 11.0f;
5521 non_linear_pixel_map = 500.0f;
5525 non_linear_range_limit = 129.0f;
5527 non_linear_pixel_map = 250.0f;
5530 if (softrange > 600) {
5531 deler =
powf(softrange, 0.75f);
5533 else if (softrange < 25) {
5536 else if (softrange < 100) {
5542 if (softrange > non_linear_range_limit) {
5543 non_linear_scale =
float(
abs(mx -
data->dragstartx)) / non_linear_pixel_map;
5546 non_linear_scale = 1.0f;
5549 if (is_float ==
false) {
5554 data->dragf += (
float(mx -
data->draglastx) / deler) * non_linear_scale;
5556 if (but->
softmin == softmin) {
5559 if (but->
softmax == softmax) {
5563 data->draglastx = mx;
5565 switch (scale_type) {
5567 tempf = (softmin +
data->dragf * softrange);
5573 const float base = softmax / log_min;
5574 tempf =
powf(base,
data->dragf) * log_min;
5575 if (tempf <= log_min) {
5581 tempf = (softmin +
data->dragf * softrange);
5582 tempf *= tempf * tempf;
5583 float cubic_min = softmin * softmin * softmin;
5584 float cubic_max = softmax * softmax * softmax;
5585 tempf = (tempf - cubic_min) / (cubic_max - cubic_min) * softrange + softmin;
5596 lvalue = int(
data->value);
5598 if (temp != lvalue) {
5599 data->dragchange =
true;
5600 data->value = double(temp);
5610 if (tempf !=
float(
data->value)) {
5611 data->dragchange =
true;
5612 data->value = tempf;
5632 if (
data->dragchange ==
false) {
5637 int mx =
data->window->eventstate->xy[0];
5638 int my =
data->window->eventstate->xy[1];
5641 if (mx < (but->
rect.
xmin + handle_width)) {
5644 else if (mx > (but->
rect.
xmax - handle_width)) {
5652 if (
data->changed_cursor) {
5654 data->changed_cursor =
false;
5658 if (
data->changed_cursor ==
false) {
5660 data->changed_cursor =
true;
5678 int mx =
event->xy[0];
5679 int my =
event->xy[1];
5681 const int screen_mx =
event->xy[0];
5692 int type =
event->type, val =
event->val;
5740#ifdef USE_DRAG_MULTINUM
5748 data->cancel =
true;
5749 data->escapecancel =
true;
5754 if (
data->dragchange) {
5755#ifdef USE_DRAG_MULTINUM
5771 const bool is_motion = (
event->type ==
MOUSEMOVE);
5775#ifdef USE_DRAG_MULTINUM
5776 data->multi_data.drag_dir[0] +=
abs(
data->draglastx - mx);
5777 data->multi_data.drag_dir[1] +=
abs(
data->draglasty - my);
5795#ifdef USE_DRAG_MULTINUM
5796 else if (
data->multi_data.has_mbuts) {
5823 const int value_step = int(number_but->
step_size);
5828 double(
max_ii(softmin,
int(
data->value) - value_step)) :
5829 double(
min_ii(softmax,
int(
data->value) + value_step));
5830 if (value_test !=
data->value) {
5831 data->value = double(value_test);
5834 data->cancel =
true;
5854 if (
UNLIKELY(!isfinite(precision))) {
5863 const double value_test =
5867 if (value_test !=
data->value) {
5868 data->value = value_test;
5871 data->cancel =
true;
5883 data->draglastx = mx;
5884 data->draglasty = my;
5893 const bool is_horizontal,
5894 const bool is_motion,
5898 float cursor_x_range, f, tempf, softmin, softmax, softrange;
5900 bool changed =
false;
5917 softrange = softmax - softmin;
5937 f = (mx_fl -
data->dragstartx) / cursor_x_range +
data->dragfstart;
5938 CLAMP(f, 0.0f, 1.0f);
5941#ifdef USE_CONT_MOUSE_CORRECT
5944 if (is_horizontal) {
5945 data->ungrab_mval[0] = but->
rect.
xmin + (f * cursor_x_range);
5949 data->ungrab_mval[1] = but->
rect.
ymin + (f * cursor_x_range);
5957 switch (scale_type) {
5959 tempf = softmin + f * softrange;
5963 tempf =
powf(softmax / softmin, f) * softmin;
5967 const float cubicmin =
cube_f(softmin);
5968 const float cubicmax =
cube_f(softmax);
5969 const float cubicrange = cubicmax - cubicmin;
5970 tempf =
cube_f(softmin + f * softrange);
5971 tempf = (tempf - cubicmin) / cubicrange * softrange + softmin;
5978 if (
ELEM(tempf, softmin, softmax)) {
5984 if (
ELEM(tempf, softmin, softmax)) {
5986 else if (softrange < 2.10f) {
5987 tempf =
roundf(tempf * 100.0f) * 0.01f;
5989 else if (softrange < 21.0f) {
5990 tempf =
roundf(tempf * 10.0f) * 0.1f;
5997 if (softrange < 2.10f) {
5998 tempf =
roundf(tempf * 10.0f) * 0.1f;
6000 else if (softrange < 21.0f) {
6004 tempf =
roundf(tempf * 0.1f) * 10.0f;
6009 temp = 10 * (temp / 10);
6017 CLAMP(temp, softmin, softmax);
6019 if (temp != lvalue) {
6021 data->dragchange =
true;
6026 CLAMP(tempf, softmin, softmax);
6028 if (tempf !=
float(
data->value)) {
6029 data->value = tempf;
6030 data->dragchange =
true;
6044 int mx =
event->xy[0];
6045 int my =
event->xy[1];
6052 int type =
event->type, val =
event->val;
6076#ifndef USE_ALLSELECT
6091 data->dragstartx = mx;
6092 data->draglastx = mx;
6106#ifdef USE_DRAG_MULTINUM
6113 data->cancel =
true;
6114 data->escapecancel =
true;
6119 if (
data->dragchange) {
6120#ifdef USE_DRAG_MULTINUM
6132#ifdef USE_CONT_MOUSE_CORRECT
6140 const bool is_motion = (
event->type ==
MOUSEMOVE);
6141#ifdef USE_DRAG_MULTINUM
6142 data->multi_data.drag_dir[0] +=
abs(
data->draglastx - mx);
6143 data->multi_data.drag_dir[1] +=
abs(
data->draglasty - my);
6157#ifdef USE_DRAG_MULTINUM
6158 else if (
data->multi_data.has_mbuts) {
6181 float f, tempf, softmin, softmax, softrange;
6188 softrange = softmax - softmin;
6190 tempf =
data->value;
6191 temp = int(
data->value);
6194 if (but->
type == SLI) {
6205 f =
powf(softmax / softmin, f) * softmin;
6208 f = softmin + f * softrange;
6220 if (temp >= softmin && temp <= softmax) {
6224 data->cancel =
true;
6228 if (tempf >= softmin && tempf <= softmax) {
6238 tempf -= value_step;
6241 tempf += value_step;
6244 CLAMP(tempf, softmin, softmax);
6245 data->value = tempf;
6248 data->cancel =
true;
6262 data->draglastx = mx;
6263 data->draglasty = my;
6274 int mx =
event->xy[0];
6275 int my =
event->xy[1];
6285 data->dragstartx = mx;
6286 data->draglastx = mx;
6289 data->dragstartx = my;
6290 data->draglastx = my;
6300 data->cancel =
true;
6301 data->escapecancel =
true;
6309 const bool is_motion =
true;
6312 (horizontal) ? mx : my,
6345 int mx =
event->xy[0];
6346 int my =
event->xy[1];
6352 data->dragstartx =
event->xy[0];
6353 data->dragstarty =
event->xy[1];
6362 data->cancel =
true;
6363 data->escapecancel =
true;
6371 int dragstartx =
data->dragstartx;
6372 int dragstarty =
data->dragstarty;
6374 data->value =
data->origvalue + (horizontal ? mx - dragstartx : dragstarty - my);
6417 data->dragstartx =
event->xy[0];
6418 data->dragstarty =
event->xy[1];
6422#ifdef USE_DRAG_TOGGLE
6425 data->dragstartx =
event->xy[0];
6426 data->dragstarty =
event->xy[1];
6438 int type =
event->type;
6439 int val =
event->val;
6465 data->postbut = but;
6492 data->cancel =
true;
6509 bool changed =
true;
6517 float *fp =
data->origvec;
6519 const float radsq = rad * rad;
6523 mdx = (rad * fp[0]);
6524 mdy = (rad * fp[1]);
6526 else if (fp[2] > -1.0f) {
6527 mrad = rad /
sqrtf(fp[0] * fp[0] + fp[1] * fp[1]);
6529 mdx = 2.0f * mrad * fp[0] - (rad * fp[0]);
6530 mdy = 2.0f * mrad * fp[1] - (rad * fp[1]);
6536 float dx =
float(mx + mdx -
data->dragstartx);
6537 float dy =
float(my + mdy -
data->dragstarty);
6540 mrad = dx * dx + dy * dy;
6544 fp[2] =
sqrtf(radsq - dx * dx - dy * dy);
6548 mrad = rad /
sqrtf(mrad);
6550 dx *= (2.0f * mrad - 1.0f);
6551 dy *= (2.0f * mrad - 1.0f);
6553 mrad = dx * dx + dy * dy;
6557 fp[2] = -
sqrtf(radsq - dx * dx - dy * dy);
6563 const int snap_steps = (
snap ==
SNAP_ON) ? 4 : 12;
6564 const float snap_steps_angle =
M_PI / snap_steps;
6565 float angle, angle_snap;
6569 for (
int i = 0;
i < 3;
i++) {
6571 angle_snap =
roundf(
angle / snap_steps_angle) * snap_steps_angle;
6572 fp[
i] =
sinf(angle_snap);
6578 data->draglastx = mx;
6579 data->draglasty = my;
6604 data->dragstartx =
event->xy[0];
6605 data->dragstarty =
event->xy[1];
6609#ifdef USE_DRAG_TOGGLE
6613 data->dragstartx =
event->xy[0];
6614 data->dragstarty =
event->xy[1];
6626 float hsv_static[3] = {0.0f};
6634 hsv[2] =
clamp_f(hsv[2] - 0.05f, 0.0f, 1.0f);
6637 hsv[2] =
clamp_f(hsv[2] + 0.05f, 0.0f, 1.0f);
6640 const float fac = 0.005 * (
event->xy[1] -
event->prev_xy[1]);
6641 hsv[2] =
clamp_f(hsv[2] + fac, 0.0f, 1.0f);
6677 data->cancel =
true;
6686 if (paint !=
nullptr) {
6689 if (brush ==
nullptr) {
6705 bool updated =
false;
6750 int mx =
event->xy[0];
6751 int my =
event->xy[1];
6757 data->dragstartx = mx;
6758 data->dragstarty = my;
6759 data->draglastx = mx;
6760 data->draglasty = my;
6782 data->cancel =
true;
6783 data->escapecancel =
true;
6801 const float v_max =
max_fff(
v[0],
v[1],
v[2]);
6804 v[0] = std::min(
v[0],
max);
6805 v[1] = std::min(
v[1],
max);
6806 v[2] = std::min(
v[2],
max);
6859 const bool changed =
true;
6863#ifdef USE_CONT_MOUSE_CORRECT
6866 data->ungrab_mval[0] = mx_fl;
6867 data->ungrab_mval[1] = my_fl;
6881 float xpos, ypos, hsvo[3];
6896 mx_fl = xpos - (
data->dragstartx - mx_fl);
6897 my_fl = ypos - (
data->dragstarty - my_fl);
6959 data->draglastx = mx;
6960 data->draglasty = my;
6965#ifdef WITH_INPUT_NDOF
6966static void ui_ndofedit_but_HSVCUBE(
uiButHSVCube *hsv_but,
6968 const wmNDOFMotionData &ndof,
6976 const float sensitivity = (shift ? 0.15f : 0.3f) * ndof.time_delta;
6982 switch (hsv_but->gradient_type) {
6984 hsv[1] += ndof.rvec[2] * sensitivity;
6985 hsv[2] += ndof.rvec[0] * sensitivity;
6988 hsv[0] += ndof.rvec[2] * sensitivity;
6989 hsv[2] += ndof.rvec[0] * sensitivity;
6992 hsv[0] += ndof.rvec[2] * sensitivity;
6993 hsv[1] += ndof.rvec[0] * sensitivity;
6996 hsv[0] += ndof.rvec[2] * sensitivity;
6999 hsv[1] += ndof.rvec[2] * sensitivity;
7002 hsv[2] += ndof.rvec[2] * sensitivity;
7009 hsv[2] += ndof.rvec[0] * sensitivity;
7011 CLAMP(hsv[2], hsv_but->softmin, hsv_but->softmax);
7039 int mx =
event->xy[0];
7040 int my =
event->xy[1];
7047 data->dragstartx = mx;
7048 data->dragstarty = my;
7049 data->draglastx = mx;
7050 data->draglasty = my;
7060#ifdef WITH_INPUT_NDOF
7062 const wmNDOFMotionData &ndof = *
static_cast<const wmNDOFMotionData *
>(
event->customdata);
7082 float rgb[3], def_hsv[3];
7093 def_hsv[0] = hsv[0];
7094 def_hsv[1] = hsv[1];
7109 data->cancel =
true;
7110 data->escapecancel =
true;
7140 const bool changed =
true;
7147#ifdef USE_CONT_MOUSE_CORRECT
7150 data->ungrab_mval[0] = mx_fl;
7151 data->ungrab_mval[1] = my_fl;
7176 if (hsv[2] == 0.0f) {
7181 if (hsv[2] == 0.0f) {
7184 hsv[2] = std::min(hsv[2], 0.9999f);
7190 float xpos, ypos, hsvo[3], rgbo[3];
7201 mx_fl = xpos - (
data->dragstartx - mx_fl);
7202 my_fl = ypos - (
data->dragstarty - my_fl);
7208 hsv[1] = 1.0f -
sqrt3f(1.0f - hsv[1]);
7226 data->draglastx = mx;
7227 data->draglasty = my;
7232#ifdef WITH_INPUT_NDOF
7233static void ui_ndofedit_but_HSVCIRCLE(
uiBut *but,
7235 const wmNDOFMotionData &ndof,
7243 const float sensitivity = (shift ? 0.06f : 0.3f) * ndof.time_delta;
7255 v[0] = r *
cosf(phi);
7256 v[1] = r *
sinf(phi);
7259 v[0] += ndof.rvec[2] * sensitivity;
7260 v[1] += ndof.rvec[0] * sensitivity;
7266 phi += ndof.rvec[1] * sensitivity * 0.5f;
7275 if (cpicker->use_color_lock) {
7277 if (hsv[2] == 0.0f) {
7282 if (hsv[2] == 0.0f) {
7285 if (hsv[2] == 1.0f) {
7299 if (cpicker->use_luminosity_lock) {
7315 int mx =
event->xy[0];
7316 int my =
event->xy[1];
7322 data->dragstartx = mx;
7323 data->dragstarty = my;
7324 data->draglastx = mx;
7325 data->draglasty = my;
7335#ifdef WITH_INPUT_NDOF
7338 const wmNDOFMotionData &ndof = *
static_cast<const wmNDOFMotionData *
>(
event->customdata);
7356 float rgb[3], def_hsv[3];
7365 def_hsv[0] = hsv[0];
7366 def_hsv[2] = hsv[2];
7382 data->cancel =
true;
7383 data->escapecancel =
true;
7389 hsv[2] =
clamp_f(hsv[2] - 0.05f, 0.0f, 1.0f);
7394 hsv[2] =
clamp_f(hsv[2] + 0.05f, 0.0f, 1.0f);
7418 bool changed =
false;
7420 if (
data->draglastx == mx) {
7424 if (
data->coba->tot == 0) {
7429 data->dragcbd->pos += dx;
7435 data->draglastx = mx;
7444 int mx =
event->xy[0];
7445 int my =
event->xy[1];
7463 data->dragstartx = mx;
7464 data->dragstarty = my;
7465 data->draglastx = mx;
7466 data->draglasty = my;
7470 for (a = 0, cbd = coba->
data; a < coba->tot; a++, cbd++) {
7472 xco =
abs(xco - mx);
7473 if (a == coba->
cur) {
7477 if (xco < mindist) {
7484 data->dragfstart =
data->dragcbd->pos;
7493 if (mx !=
data->draglastx || my !=
data->draglasty) {
7504 data->dragcbd->pos =
data->dragfstart;
7506 data->cancel =
true;
7507 data->escapecancel =
true;
7528 bool changed =
false;
7535 int dragx =
data->draglastx;
7536 int dragy =
data->draglasty;
7545 d[0] = mx -
data->dragstartx;
7546 d[1] = my -
data->dragstarty;
7553 float fx = (mx - dragx) / zoomx;
7554 float fy = (my - dragy) / zoomy;
7556 if (
data->dragsel != -1) {
7559 bool moved_point =
false;
7564 for (
int a = 0; a < cuma->
totpoint; a++) {
7566 const float origx = cmp[a].
x, origy = cmp[a].
y;
7570 cmp[a].
x = 0.125f *
roundf(8.0f * cmp[a].
x);
7571 cmp[a].
y = 0.125f *
roundf(8.0f * cmp[a].
y);
7573 if (cmp[a].
x != origx || cmp[a].
y != origy) {
7584 data->draglastx = evtx;
7585 data->draglasty = evty;
7588#ifdef USE_CONT_MOUSE_CORRECT
7600 data->dragchange =
true;
7605 if (cumap->
curr.
xmin - fx < cumap->clipr.xmin) {
7611 if (cumap->
curr.
ymin - fy < cumap->clipr.ymin) {
7624 data->draglastx = evtx;
7625 data->draglasty = evty;
7636 bool changed =
false;
7640 int mx =
event->xy[0];
7641 int my =
event->xy[1];
7648 const float m_xy[2] = {
float(mx),
float(my)};
7663 for (
int a = 0; a < cuma->
totpoint; a++) {
7667 if (dist_sq < dist_min_sq) {
7669 dist_min_sq = dist_sq;
7674 float f_xy[2], f_xy_prev[2];
7703 for (
int a = 0; a < cuma->
totpoint; a++) {
7704 if (cmp[a].
x == f_xy[0]) {
7717 for (
int a = 0; a < cuma->
totpoint; a++) {
7728 data->cancel =
true;
7731 data->dragsel = sel;
7733 data->dragstartx =
event->xy[0];
7734 data->dragstarty =
event->xy[1];
7735 data->draglastx =
event->xy[0];
7736 data->draglasty =
event->xy[1];
7744 if (event->
xy[0] !=
data->draglastx || event->
xy[1] !=
data->draglasty) {
7759 if (
data->dragsel != -1) {
7764 if (
data->dragchange ==
false) {
7767 for (
int a = 0; a < cuma->
totpoint; a++) {
7802 bool changed =
false;
7809 int dragx =
data->draglastx;
7810 int dragy =
data->draglasty;
7823 float fx = (mx - dragx) / zoomx;
7824 float fy = (my - dragy) / zoomy;
7826 if (
data->dragsel != -1) {
7827 float last_x, last_y;
7829 bool moved_point =
false;
7835 const float delta[2] = {fx, fy};
7836 for (
int a = 0; a < profile->
path_len; a++) {
7847 last_x = pts[a].
h1_loc[0];
7848 last_y = pts[a].
h1_loc[1];
7852 last_x = pts[a].
h2_loc[0];
7853 last_y = pts[a].
h2_loc[1];
7861 data->draglastx = evtx;
7862 data->draglasty = evty;
7864#ifdef USE_CONT_MOUSE_CORRECT
7875 data->dragchange =
true;
7880 if (profile->
view_rect.
xmin - fx < profile->clip_rect.xmin) {
7886 if (profile->
view_rect.
ymin - fy < profile->clip_rect.ymin) {
7899 data->draglastx = evtx;
7900 data->draglasty = evty;
7926 int mx =
event->xy[0];
7927 int my =
event->xy[1];
7933 data->dragstartx = mx;
7934 data->dragstarty = my;
7935 data->draglastx = mx;
7936 data->draglasty = my;
7952 const float m_xy[2] = {
float(mx),
float(my)};
7966 int i_selected = -1;
7967 short selection_type = 0;
7972 if (dist_sq < dist_min_sq) {
7975 dist_min_sq = dist_sq;
7983 if (dist_sq < dist_min_sq) {
7986 dist_min_sq = dist_sq;
7992 if (dist_sq < dist_min_sq) {
7995 dist_min_sq = dist_sq;
8002 if (i_selected == -1) {
8003 float f_xy[2], f_xy_prev[2];
8021 i_selected = int(new_pt - profile->
path);
8022 BLI_assert(i_selected >= 0 && i_selected <= profile->path_len);
8030 if (i_selected != -1) {
8033 pts[i_selected].
flag ^= selection_type;
8040 profile->
path[i_selected].
flag |= selection_type;
8045 data->cancel =
true;
8048 data->dragsel = i_selected;
8050 data->dragstartx = mx;
8051 data->dragstarty = my;
8052 data->draglastx = mx;
8053 data->draglasty = my;
8061 if (mx !=
data->draglastx || my !=
data->draglasty) {
8071 if (
data->dragsel != -1) {
8073 if (
data->dragchange ==
false) {
8092 const bool changed =
true;
8093 const float dy = my -
data->draglasty;
8097 hist->
ymax += (dy * 0.1f) * yfac;
8102 data->draglastx = mx;
8103 data->draglasty = my;
8111 int mx =
event->xy[0];
8112 int my =
event->xy[1];
8117 data->dragstartx = mx;
8118 data->dragstarty = my;
8119 data->draglastx = mx;
8120 data->draglasty = my;
8142 data->cancel =
true;
8143 data->escapecancel =
true;
8148 if (mx !=
data->draglastx || my !=
data->draglasty) {
8166 const bool changed =
true;
8168 const float dy = my -
data->draglasty;
8175 data->draglastx = mx;
8176 data->draglasty = my;
8184 int mx =
event->xy[0];
8185 int my =
event->xy[1];
8190 data->dragstartx = mx;
8191 data->dragstarty = my;
8192 data->draglastx = mx;
8193 data->draglasty = my;
8215 data->cancel =
true;
8216 data->escapecancel =
true;
8221 if (mx !=
data->draglastx || my !=
data->draglasty) {
8240 const bool changed =
true;
8242 float dx = mx -
data->draglastx;
8243 float dy = my -
data->draglasty;
8266 data->draglastx = mx;
8267 data->draglasty = my;
8275 int mx =
event->xy[0];
8276 int my =
event->xy[1];
8281 data->dragstartx = mx;
8282 data->dragstarty = my;
8283 data->draglastx = mx;
8284 data->draglasty = my;
8298 data->cancel =
true;
8299 data->escapecancel =
true;
8304 if (mx !=
data->draglastx || my !=
data->draglasty) {
8335 bool is_press_ctrl_but_no_shift = (
event->val ==
KM_PRESS) &&
8338 const bool do_copy =
event->type ==
EVT_CKEY && is_press_ctrl_but_no_shift;
8339 const bool do_paste =
event->type ==
EVT_VKEY && is_press_ctrl_but_no_shift;
8367 if (clicked_view_item_but) {
8383#ifdef WITH_INPUT_NDOF
8421 switch (but->
type) {
8535#ifdef USE_DRAG_MULTINUM
8553 const float dir_nor_y[2] = {0.0, 1.0f};
8554 float dir_nor_drag[2];
8560 data->multi_data.drag_lock_x =
event->xy[0];
8571 if ((
data->text_edit.edit_string &&
8573 ((
abs(
data->multi_data.drag_lock_x - event->
xy[0]) > margin_x) &&
8577 if (
data->multi_data.has_mbuts) {
8614 block->tooltipdisabled = !enable;
8633 if (
data->autoopentimer) {
8635 data->autoopentimer =
nullptr;
8645 bContext *
C,
ARegion *region,
int *pass,
double *r_pass_delay,
bool *r_exit_on_event)
8647 bool is_quick_tip =
false;
8649 is_quick_tip =
true;
8655 *r_exit_on_event =
false;
8675 if (!wm->
runtime->drags.first) {
8728 if (
data->used_mouse && !
data->autoopentimer) {
8737 time = 5 *
U.menuthreshold2;
8740 time = 5 *
U.menuthreshold1;
8784#if defined(__APPLE__)
8808 "Can't edit driven number value, see driver editor for the driver setup");
8814#ifdef USE_CONT_MOUSE_CORRECT
8817 int mouse_ungrab_xy[2];
8820 mouse_ungrab_xy[0] =
data->ungrab_mval[0];
8821 mouse_ungrab_xy[1] =
data->ungrab_mval[1];
8845 else if (
data->flashtimer) {
8847 data->flashtimer =
nullptr;
8855 else if (
data->hold_action_timer) {
8857 data->hold_action_timer =
nullptr;
8866 &
data->window->modalhandlers,
8932 data->region = region;
8934#ifdef USE_CONT_MOUSE_CORRECT
8943 data->interactive =
true;
8964 data->used_mouse =
true;
8972 if (
data->menu &&
data->menu->region) {
9033#ifdef USE_DRAG_MULTINUM
9034 if (
data->multi_data.has_mbuts) {
9035 for (
const std::unique_ptr<uiBut> &bt : block->
buttons) {
9039 if (!
data->cancel) {
9053 if (!
data->cancel ||
data->escapecancel) {
9062 if (!onfree && !
data->cancel) {
9070 uiBut but_temp = *but;
9084 if (
U.runtime.is_dirty ==
false) {
9091 for (
const std::unique_ptr<uiBut> &bt : block_iter->buttons) {
9101 if (
data->text_edit.edit_string) {
9104 if (
data->text_edit.original_string) {
9112 if (
data->changed_cursor) {
9121 if (
data->custom_interaction_handle !=
nullptr) {
9124 data->custom_interaction_handle->user_count--;
9127 if (
data->custom_interaction_handle->user_count == 0) {
9131 data->custom_interaction_handle =
nullptr;
9161 data->cancel =
true;
9175 [&]() { ui_but_active_free(C, but); });
9181 uiBut *but_found =
nullptr;
9189 uiBut *active_but_override =
nullptr;
9190 uiBut *active_but_real =
nullptr;
9191 uiBut *active_but_last =
nullptr;
9195 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
9197 active_but_override = but.get();
9200 active_but_real = but.get();
9203 active_but_last = but.get();
9208 uiBut *activebut = active_but_override;
9210 activebut = active_but_real;
9213 activebut = active_but_last;
9216 if (activebut && (but_check_cb ==
nullptr || but_check_cb(activebut))) {
9219 but_found = activebut;
9222 if (
data &&
data->menu && (region !=
data->menu->region)) {
9223 region =
data->menu->region;
9292 region_popup ? region_popup :
CTX_wm_region(
C), r_ptr, r_prop, r_index);
9310 if (activebut->
func) {
9334 if (region_ctx ==
nullptr) {
9340 if (block->ui_operator) {
9341 return block->ui_operator;
9350 if (region == region_ctx) {
9354 if (block->ui_operator) {
9355 return block->ui_operator;
9380 uiBut *activebut =
nullptr;
9383 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
9393 activebut = but.get();
9396 activebut = but.get();
9405 region =
data->menu->region;
9421 if (!active_but || !active_but->
active || !active_but->
changed || active_but->
block != block) {
9427 if (
data->searchbox) {
9443 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
9455 const bool labeledit =
event->modifier &
KM_CTRL;
9459 const bool for_tooltip =
true;
9461 region, event->
xy, labeledit, for_tooltip,
nullptr,
nullptr);
9498 event.customdata = but;
9499 event.customdata_free =
false;
9516 *active_back = but->
active;
9517 data = MEM_new<uiHandleButtonData>(__func__);
9520 data->region = region;
9543 data->cancel =
true;
9569 CLOG_WARN(&
LOG,
"%s: error, unhandled type: %d", __func__,
int(but->
type));
9595 if (prev_active_but) {
9596 prev_active_but->
active =
nullptr;
9612 if (prev_active_but) {
9613 prev_active_but->
active = prev_active_data;
9630 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
9649 double default_value;
9653 default_value = double(
9662 default_value = double(
9670 *r_value = default_value;
9688 switch (event->
type) {
9691 data->cancel =
true;
9694#ifdef USE_UI_POPOVER_ONCE
9700 data->cancel =
false;
9735 data->cancel =
true;
9740 bool reenable_tooltip =
true;
9746 reenable_tooltip = (movement > threshold);
9748 if (reenable_tooltip) {
9763 data->autoopentimer =
nullptr;
9788 switch (event->
type) {
9790 data->cancel =
true;
9797 data->cancel =
true;
9805 data->hold_action_timer =
nullptr;
9818 if (
data->hold_action_timer) {
9822 if (movement <= threshold) {
9834 data->cancel =
false;
9841 data->cancel =
true;
9856 switch (event->
type) {
9872 switch (event->
type) {
9876 if (
data->menu &&
data->menu->region) {
9886 data->cancel =
true;
9921 if ((
data->cancel ==
false) && (
data->text_edit.edit_string !=
nullptr) &&
9922 (
data->text_edit.edit_string[0] ==
'\0') &&
9928#ifdef USE_DRAG_MULTINUM
9929 if (
data->multi_data.mbuts) {
9933 double default_value;
9940 data->multi_data.skip =
true;
9998 int type =
event->type, val =
event->val;
10000 bool redraw =
false;
10003 if (!ui_list || !ui_list->
dyn_data) {
10008 int mx =
event->xy[0];
10009 int my =
event->xy[1];
10036 value = value_orig;
10045 int current_idx = -1;
10047 for (
int i = 0;
i <
len;
i++) {
10049 org_order[new_order ? new_order[++org_idx] : ++org_idx] =
i;
10051 current_idx = new_order ? new_order[org_idx] : org_idx;
10054 else if (
i == value && org_idx >= 0) {
10055 current_idx = -(new_order ? new_order[org_idx] : org_idx) - 1;
10062 if (current_idx < 0) {
10063 current_idx = (current_idx * -1) + (inc < 0 ? inc : inc - 1);
10066 current_idx += inc;
10069 value = org_order[current_idx];
10081 if (value != value_orig) {
10127 const bool has_view = [&]() {
10136 if (!has_view && !has_list) {
10142 uiBut *highlight_row_but = [&]() ->
uiBut * {
10155 bool changed =
false;
10157 if (highlight_row_but && !(highlight_row_but->
flag &
UI_HOVER)) {
10163 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
10164 if (but.get() == highlight_row_but) {
10190 switch (event->
type) {
10217 const bool close_popup = view_but == active_but;
10256 if (
data->interactive) {
10269 data->cancel =
true;
10285 data->cancel =
true;
10342 const bool use_wiggle_room)
10357 }
while ((region = region->
next));
10379 const float p1[2] = {rect_px.
xmin - margin, rect_px.
ymin - margin};
10380 const float p2[2] = {rect_px.
xmax + margin, rect_px.
ymin - margin};
10381 const float p3[2] = {rect_px.
xmax + margin, rect_px.
ymax + margin};
10382 const float p4[2] = {rect_px.
xmin - margin, rect_px.
ymax + margin};
10386 if (use_wiggle_room) {
10411#ifdef USE_KEYNAV_LIMIT
10465 for (
const std::unique_ptr<uiBut> &bt : block->
buttons) {
10466 ymax =
max_ff(ymax, bt->rect.ymax);
10469 dy = block->
rect.
ymax - ymax - scroll_pad;
10475 for (
const std::unique_ptr<uiBut> &bt : block->
buttons) {
10476 ymin =
min_ff(ymin, bt->rect.ymin);
10479 dy = block->
rect.
ymin - ymin + scroll_pad;
10489 for (
const std::unique_ptr<uiBut> &bt : block->
buttons) {
10490 bt->rect.ymin += dy;
10491 bt->rect.ymax += dy;
10529 else if (test ==
'b') {
10542 if (scroll_dir == 1) {
10548 else if (scroll_dir == -1) {
10571 block->auto_open =
false;
10587 const bool is_parent_menu,
10593 if ((level != 0) && (but ==
nullptr) && (is_parent_menu || menu->
popup ==
false)) {
10694 after->
opptr = MEM_new<PointerRNA>(__func__);
10700 if (num_bytes != -1) {
10701 char buf[
sizeof(
event->utf8_buf) + 1];
10702 memcpy(buf, event->
utf8_buf, num_bytes);
10703 buf[num_bytes] =
'\0';
10717 const bool is_parent_inside,
10718 const bool is_parent_menu,
10719 const bool is_floating)
10727 int mx =
event->xy[0];
10728 int my =
event->xy[1];
10734 const bool inside_title = inside && ((my + (
UI_UNIT_Y * 1.4f)) > block->
rect.
ymax);
10739#ifdef USE_DRAG_POPUP
10741# if defined(__APPLE__)
10751 if (!menu->
is_grab && is_floating) {
10762 else if (win->
cursor == PopupTitleHoverCursor) {
10826 switch (event->
type) {
10834 if (inside ==
false) {
10867 menu, but, level, is_parent_menu, retval))
10899 const float dy =
event->xy[1] -
event->prev_xy[1];
10920 const int scroll_dir = (
event->type ==
WHEELUPMOUSE) ? 1 : -1;
10943 int type =
event->type;
10944 int val =
event->val;
10969 menu, but, level, is_parent_menu, retval))
10974#ifdef USE_KEYNAV_LIMIT
10997 uiBut *but_wrap =
nullptr;
11082 menu, but, level, is_parent_menu, retval))
11098 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
11108 if (but->rnapoin.data && but->rnaprop &&
11111 if (but->rnaindex == act - 1) {
11115 else if (
ELEM(but->type,
11184 if ((level != 0) && (but ==
nullptr || !menu->
menu_idname[0])) {
11195 menu, but, level, is_parent_menu, retval))
11201 for (
const std::unique_ptr<uiBut> &but_iter : block->
buttons) {
11232 if ((inside ==
false) && (menu->
menuretval == 0)) {
11251 &saferct->
parent,
float(event->
xy[0]),
float(event->
xy[1])))
11277#ifdef USE_KEYNAV_LIMIT
11292 if ((but_default !=
nullptr) && (but_default->
active ==
nullptr)) {
11306 if (but_active ==
nullptr) {
11311#ifdef USE_DRAG_POPUP
11313 (inside && is_floating && inside_title))
11338 saferct = saferct->
next)
11385#ifdef USE_UI_POPOVER_ONCE
11475 if (!force_close) {
11505 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
11517 if (but ==
nullptr) {
11574 if (duration > 0.01 *
U.pie_initial_timeout) {
11582 0.01 *
U.pie_animation_timeout;
11583 float fac = duration / final_time;
11591 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
11598 center[0] = (vec[0] > 0.01f) ? 0.5f : ((vec[0] < -0.01f) ? -0.5f : 0.0f);
11599 center[1] = (vec[1] > 0.99f) ? 0.5f : ((vec[1] < -0.99f) ? -0.5f : 0.0f);
11629 if (len_sq < 1.0f) {
11658 if (but && (
U.pie_menu_confirm > 0) &&
11659 (dist >=
UI_SCALE_FAC * (
U.pie_menu_threshold +
U.pie_menu_confirm)))
11672 switch (event->
type) {
11674 if (!is_click_style) {
11684 if ((
U.pie_menu_confirm > 0) &&
11685 (dist >=
UI_SCALE_FAC * (
U.pie_menu_threshold +
U.pie_menu_confirm)))
11700 if (is_click_style) {
11752 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
11753 if (but->menu_key == event->
type) {
11761#define CASE_NUM_TO_DIR(n, d) \
11762 case (EVT_ZEROKEY + n): \
11763 case (EVT_PAD0 + n): { \
11764 if (num_dir == UI_RADIAL_NONE) { \
11790#undef CASE_NUM_TO_DIR
11805 const bool is_parent_inside,
11806 const bool is_parent_menu,
11807 const bool is_floating)
11810 bool do_towards_reinit =
false;
11820 bool inside =
false;
11826 if (do_recursion) {
11827 if (is_parent_inside ==
false) {
11828 int mx =
event->xy[0];
11829 int my =
event->xy[1];
11835 C, event, submenu, level + 1, is_parent_inside || inside, is_menu,
false);
11840 if (block->panel) {
11841 int mx =
event->xy[0];
11842 int my =
event->xy[1];
11844 if (!
IN_RANGE(
float(mx), block->rect.xmin, block->rect.xmax)) {
11884 if (do_but_search) {
11893 do_towards_reinit =
true;
11904 bool handled =
false;
11909 retval = retval_test;
11914 if (handled ==
false) {
11916 C, event, menu, level, is_parent_inside, is_parent_menu, is_floating);
11928 if (do_towards_reinit) {
12012 if (region ==
nullptr) {
12018 if (screen ==
nullptr) {
12034 BLI_assert(active_but->semi_modal_state ==
nullptr);
12071 if (
data->menu &&
data->menu->region &&
12079 if (!but_other->
str.empty()) {
12106 if (but_other->
icon && !but_other->
str.empty()) {
12113 return (event->
mval[0] <
int(
left) || event->
mval[0] >
int(right));
12163 if (
data->menu &&
data->menu->menuretval) {
12216 bool reset_pie =
false;
12253#ifdef USE_DRAG_TOGGLE
12373 const void *rna_poin_data,
12374 const char *rna_prop_id)
12376 uiBlock *block_text =
nullptr;
12377 uiBut *but_text =
nullptr;
12380 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
12382 if (but->rnaprop && but->rnapoin.data == rna_poin_data) {
12384 block_text = block;
12385 but_text = but.get();
12411 uiBlock *block_text =
nullptr;
12412 uiBut *but_text =
nullptr;
12415 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
12417 block_text = block;
12418 but_text = but.get();
12444 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
12445 if (but->active ==
nullptr) {
12463 if (
data->menu ==
nullptr &&
data->searchbox ==
nullptr) {
12520 const bool is_click)
12525 int unique_retval_ids_len = 0;
12526 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
12528 unique_retval_ids_len++;
12533 unique_retval_ids_len = 0;
12534 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
12536 unique_retval_ids[unique_retval_ids_len++] = but->retval;
12540 if (unique_retval_ids_len > 1) {
12543 unique_retval_ids_len);
12544 unique_retval_ids =
static_cast<int *
>(
12545 MEM_reallocN(unique_retval_ids,
sizeof(*unique_retval_ids) * unique_retval_ids_len));
12554 return interaction;
12589 const bool is_click)
12591 if (
data->custom_interaction_handle) {
12600 data->custom_interaction_handle = interaction;
AnimationEvalContext BKE_animsys_eval_context_construct(struct Depsgraph *depsgraph, float eval_time) ATTR_WARN_UNUSED_RESULT
void BKE_brush_color_set(Paint *paint, Brush *brush, const float color[3])
void BKE_brush_tag_unsaved_changes(Brush *brush)
CBData * BKE_colorband_element_add(ColorBand *coba, float position)
void BKE_colorband_update_sort(ColorBand *coba)
ReportList * CTX_wm_reports(const bContext *C)
bScreen * CTX_wm_screen(const bContext *C)
MovieClip * CTX_data_edit_movieclip(const bContext *C)
ARegion * CTX_wm_region_popup(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
void CTX_store_set(bContext *C, const bContextStore *store)
void CTX_wm_area_set(bContext *C, ScrArea *area)
void CTX_wm_region_set(bContext *C, ARegion *region)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
void CTX_wm_region_popup_set(bContext *C, ARegion *region_popup)
ViewLayer * CTX_data_view_layer(const bContext *C)
bool BKE_curveprofile_move_point(struct CurveProfile *profile, struct CurveProfilePoint *point, bool snap, const float delta[2])
void BKE_curveprofile_update(struct CurveProfile *profile, int update_flags)
@ PROF_UPDATE_REMOVE_DOUBLES
struct CurveProfilePoint * BKE_curveprofile_insert(struct CurveProfile *profile, float x, float y)
void BKE_curveprofile_copy_data(struct CurveProfile *target, const struct CurveProfile *profile)
bool BKE_curveprofile_move_handle(struct CurveProfilePoint *point, bool handle_1, bool snap, const float delta[2])
void BKE_curveprofile_remove_by_flag(struct CurveProfile *profile, short flag)
int BKE_curveprofile_table_size(const struct CurveProfile *profile)
void BKE_curveprofile_free_data(struct CurveProfile *profile)
float BKE_movieclip_remap_scene_to_clip_frame(const struct MovieClip *clip, float framenr)
void BKE_paint_invalidate_cursor_overlay(Scene *scene, ViewLayer *view_layer, CurveMapping *curve)
void BKE_palette_color_remove(Palette *palette, PaletteColor *color)
Paint * BKE_paint_get_active_from_context(const bContext *C)
Brush * BKE_paint_brush(Paint *paint)
PaintMode BKE_paintmode_get_active_from_context(const bContext *C)
void BKE_report(ReportList *reports, eReportType type, const char *message)
float BKE_scene_frame_get(const Scene *scene)
struct MovieTrackingMarker * BKE_tracking_marker_ensure(struct MovieTrackingTrack *track, int framenr)
bool BKE_unit_is_valid(int system, int type)
double BKE_unit_base_scalar(int system, int type)
float BLF_width(int fontid, const char *str, size_t str_len, ResultBLF *r_info=nullptr) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2)
size_t BLF_str_offset_from_cursor_position(int fontid, const char *str, size_t str_len, int location_x) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2)
Generic array manipulation API.
#define BLI_array_deduplicate_ordered(arr, arr_len)
#define BLI_assert_msg(a, msg)
void BLI_linklist_freeN(LinkNode *list)
void void BLI_linklist_prepend(LinkNode **listp, void *ptr) ATTR_NONNULL(1)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int round_fl_to_int_clamp(float a)
MINLINE float max_fff(float a, float b, float c)
MINLINE int round_fl_to_int(float a)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE float pow2f(float x)
MINLINE float clamp_f(float value, float min, float max)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
MINLINE float cube_f(float a)
MINLINE float square_f(float a)
MINLINE float sqrt3f(float f)
void hsv_to_rgb_v(const float hsv[3], float r_rgb[3])
void rgb_to_hsv_v(const float rgb[3], float r_hsv[3])
void rgb_to_hsv_compat_v(const float rgb[3], float r_hsv[3])
void linearrgb_to_srgb_v3_v3(float srgb[3], const float linear[3])
void hsl_to_rgb_v(const float hsl[3], float r_rgb[3])
void hsv_clamp_v(float hsv[3], float v_max)
void srgb_to_linearrgb_v3_v3(float linear[3], const float srgb[3])
void rgb_to_hsl_v(const float rgb[3], float r_hsl[3])
void rgb_to_hsl_compat_v(const float rgb[3], float r_hsl[3])
int isect_point_tri_v2(const float pt[2], const float v1[2], const float v2[2], const float v3[2])
float dist_squared_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE float len_squared_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_squared_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v2_length(float n[2], float unit_length)
MINLINE float len_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v2_v2_int(int r[2], const int a[2])
void dist_ensure_v2_v2fl(float v1[2], const float v2[2], float dist)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v2_v2(float r[2], const float a[2])
MINLINE int len_manhattan_v2v2_int(const int a[2], const int b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE bool compare_v3v3(const float v1[3], const float v2[3], float limit) ATTR_WARN_UNUSED_RESULT
MINLINE float len_manhattan_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float dot_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void zero_v3(float r[3])
MINLINE float normalize_v2_v2(float r[2], const float a[2])
MINLINE float normalize_v3_length(float n[3], float unit_length)
MINLINE float normalize_v3(float n[3])
MINLINE void copy_v2_fl(float r[2], float f)
ATTR_WARN_UNUSED_RESULT const size_t num
int BLI_path_sequence_decode(const char *path, char *head, size_t head_maxncpy, char *tail, size_t tail_maxncpy, unsigned short *r_digits_len)
void BLI_path_sequence_encode(char *path, size_t path_maxncpy, const char *head, const char *tail, unsigned short numlen, int pic)
bool BLI_rctf_clamp_pt_v(const struct rctf *rect, float xy[2])
BLI_INLINE float BLI_rctf_cent_y(const struct rctf *rct)
void BLI_rctf_transform_pt_v(const rctf *dst, const rctf *src, float xy_dst[2], const float xy_src[2])
BLI_INLINE float BLI_rctf_cent_x(const struct rctf *rct)
bool BLI_rctf_isect_rect_y(const struct rctf *src1, const struct rctf *src2, float range_y[2])
bool BLI_rctf_isect_segment(const struct rctf *rect, const float s1[2], const float s2[2])
bool BLI_rctf_isect_rect_x(const struct rctf *src1, const struct rctf *src2, float range_x[2])
void BLI_rctf_recenter(struct rctf *rect, float x, float y)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
bool BLI_rctf_isect_pt(const struct rctf *rect, float x, float y)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
void BLI_rcti_rctf_copy(struct rcti *dst, const struct rctf *src)
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
int BLI_sortutil_cmp_int(const void *a_, const void *b_)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_str_rstrip_digits(char *str) ATTR_NONNULL()
int BLI_str_rstrip_float_zero(char *str, char pad) ATTR_NONNULL(1)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
bool BLI_str_cursor_step_prev_utf8(const char *str, int str_maxlen, int *pos)
void BLI_str_cursor_step_utf8(const char *str, int str_maxlen, int *pos, eStrCursorJumpDirection direction, eStrCursorJumpType jump, bool use_init_step)
void BLI_str_cursor_step_bounds_utf8(const char *str, int str_maxlen, int pos, int *r_start, int *r_end)
const char const char * BLI_str_find_next_char_utf8(const char *p, const char *str_end) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1
size_t size_t size_t BLI_snprintf_utf8(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
char * BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
size_t size_t BLI_strnlen_utf8(const char *strc, size_t strc_maxlen) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
size_t BLI_strlen_utf8(const char *strc) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
size_t BLI_strnlen_utf8_ex(const char *strc, size_t strc_maxlen, size_t *r_len_bytes) ATTR_NONNULL(1
size_t BLI_snprintf_utf8_rlen(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
int BLI_str_utf8_invalid_strip(char *str, size_t str_len) ATTR_NONNULL(1)
#define STRNCPY_UTF8(dst, src)
const char int BLI_str_utf8_size_or_error(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Platform independent time functions.
double BLI_time_now_seconds(void)
#define IN_RANGE(a, b, c)
#define UNUSED_VARS_NDEBUG(...)
#define CLOG_WARN(clg_ref,...)
#define CLOG_INFO_NOCHECK(clg_ref, format,...)
#define RGN_ALIGN_ENUM_FROM_MASK(align)
#define UI_LIST_AUTO_SIZE_THRESHOLD
@ UILST_LAYOUT_BIG_PREVIEW_GRID
@ UILST_SCROLL_TO_ACTIVE_ITEM
@ RGN_TYPE_ASSET_SHELF_HEADER
@ USER_FLAG_RECENT_SEARCHES_DISABLE
void ED_region_tag_refresh_ui(ARegion *region)
#define ED_screen_areas_iter(win, screen, area_name)
void ED_region_tag_redraw_no_rebuild(ARegion *region)
void ED_workspace_status_text(bContext *C, const char *str)
void ED_region_tag_redraw(ARegion *region)
void ED_undo_push(bContext *C, const char *str)
bool ED_undo_is_legacy_compatible_for_property(bContext *C, ID *id, PointerRNA &ptr)
GHOST C-API function and type declarations.
void GHOST_SetAutoFocus(bool auto_focus)
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
BLI_INLINE void IMB_colormanagement_srgb_to_scene_linear_v3(float scene_linear[3], const float srgb[3])
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
#define RNA_SUBTYPE_UNIT_VALUE(subtype)
bool UI_view_item_can_rename(const blender::ui::AbstractViewItem &item)
void UI_region_views_clear_search_highlight(const ARegion *region)
#define AUTOCOMPLETE_FULL_MATCH
@ UI_BLOCK_MOVEMOUSE_QUIT
bool UI_view_item_drag_start(bContext &C, blender::ui::AbstractViewItem &item)
bool UI_but_has_quick_tooltip(const uiBut *but)
void UI_blocklist_free(const bContext *C, ARegion *region)
bool UI_view_item_popup_keep_open(const blender::ui::AbstractViewItem &item)
int UI_but_unit_type_get(const uiBut *but)
void(*)(bContext *C, void *arg, char *origstr) uiButHandleRenameFunc
bool UI_list_item_index_is_filtered_visible(const struct uiList *ui_list, int item_idx)
MenuType * UI_but_menutype_get(const uiBut *but)
bool UI_but_is_utf8(const uiBut *but)
#define AUTOCOMPLETE_NO_MATCH
void UI_popover_once_clear(uiPopover *pup)
@ UI_BUT2_FORCE_SEMI_MODAL_ACTIVE
@ UI_BUT2_ACTIVATE_ON_INIT_NO_SELECT
uiBut * UI_but_find_mouse_over(const ARegion *region, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
#define UI_PRECISION_FLOAT_MAX
#define UI_PRECISION_FLOAT_SCALE
void(*)(void *argN) uiButArgNFree
void UI_but_execute(const bContext *C, ARegion *region, uiBut *but)
void UI_view_item_begin_rename(blender::ui::AbstractViewItem &item)
ARegion * UI_tooltip_create_from_button_or_extra_icon(bContext *C, ARegion *butregion, uiBut *but, uiButExtraOpIcon *extra_icon, bool is_quick_tip)
void(*)(bContext *C, void *arg, int event) uiBlockHandleFunc
const uiStyle * UI_style_get()
void UI_fontstyle_set(const uiFontStyle *fs)
uiBlock *(*)(bContext *C, ARegion *region, void *arg1) uiBlockCreateFunc
PointerRNA * UI_but_operator_ptr_ensure(uiBut *but)
PanelType * UI_but_paneltype_get(const uiBut *but)
void UI_butstore_register(uiButStore *bs_handle, uiBut **but_p)
uiButStore * UI_butstore_create(uiBlock *block)
bool UI_context_copy_to_selected_list(bContext *C, PointerRNA *ptr, PropertyRNA *prop, blender::Vector< PointerRNA > *r_lb, bool *r_use_path_from_id, std::optional< std::string > *r_path)
bool UI_but_active_only(const bContext *C, ARegion *region, uiBlock *block, uiBut *but)
void(*)(bContext *C, void *argN, void *arg2) uiButHandleNFunc
void(*)(bContext *C, void *arg1, void *arg2) uiButHandleFunc
bool UI_view_item_supports_drag(const blender::ui::AbstractViewItem &item)
void UI_popup_menu_close_from_but(const uiBut *but, bool is_cancel=false)
void UI_butstore_free(uiBlock *block, uiButStore *bs_handle)
void UI_but_ensure_in_view(const bContext *C, ARegion *region, const uiBut *but)
bool UI_context_copy_to_selected_check(PointerRNA *ptr, PointerRNA *ptr_link, PropertyRNA *prop, const char *path, bool use_path_from_id, PointerRNA *r_ptr, PropertyRNA **r_prop)
#define UI_but_is_decorator(but)
#define UI_TOOLTIP_DELAY_QUICK
void(*)(void *arg) uiFreeArgFunc
void(*)(bContext *C, uiLayout *layout, void *arg1) uiMenuCreateFunc
#define WM_UI_HANDLER_CONTINUE
#define ND_SPACE_INFO_REPORT
#define WM_UI_HANDLER_BREAK
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert * v
BPy_StructRNA * depsgraph
void activate(bool forceActivation=false) const
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
void jump(const btVector3 &v=btVector3(0, 0, 0))
void resize(const int64_t new_size)
void activate(bContext &C)
void activate_for_context_menu(bContext &C)
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
float length(VecOp< float, D >) RET
static void copy_array(const Node *node, const SocketType &socket, const Node *other, const SocketType &other_socket)
void ui_but_v4_get(uiBut *but, float vec[4])
bool ui_but_is_unit(const uiBut *but)
void ui_but_range_set_hard(uiBut *but)
void ui_but_extra_operator_icons_free(uiBut *but)
bool ui_but_is_compatible(const uiBut *but_a, const uiBut *but_b)
void ui_window_to_block(const ARegion *region, const uiBlock *block, int *x, int *y)
void ui_but_string_get_ex(uiBut *but, char *str, const size_t str_maxncpy, const int float_precision, const bool use_exp_float, bool *r_use_exp_float)
void ui_but_range_set_soft(uiBut *but)
void ui_but_update(uiBut *but)
int ui_but_is_pushed(uiBut *but)
bool ui_but_is_float(const uiBut *but)
PropertyScaleType ui_but_scale_type(const uiBut *but)
void ui_but_override_flag(Main *bmain, uiBut *but)
double ui_but_value_get(uiBut *but)
float ui_block_to_window_scale(const ARegion *region, const uiBlock *block)
void ui_but_string_get(uiBut *but, char *str, const size_t str_maxncpy)
void ui_region_to_window(const ARegion *region, int *x, int *y)
void ui_window_to_block_fl(const ARegion *region, const uiBlock *block, float *x, float *y)
bool ui_but_is_rna_valid(uiBut *but)
bool ui_but_string_set(bContext *C, uiBut *but, const char *str)
bool ui_but_menu_draw_as_popover(const uiBut *but)
void ui_but_value_set(uiBut *but, double value)
char * ui_but_string_get_dynamic(uiBut *but, int *r_str_size)
void ui_block_to_window_rctf(const ARegion *region, const uiBlock *block, rctf *rct_dst, const rctf *rct_src)
void ui_but_update_edited(uiBut *but)
void ui_but_v3_set(uiBut *but, const float vec[3])
void ui_but_v3_get(uiBut *but, float vec[3])
int ui_but_string_get_maxncpy(uiBut *but)
bool ui_but_string_eval_number(bContext *C, const uiBut *but, const char *str, double *r_value)
void ui_fontscale(float *points, float aspect)
void ui_block_to_window_fl(const ARegion *region, const uiBlock *block, float *x, float *y)
void ui_but_convert_to_unit_alt_name(uiBut *but, char *str, size_t str_maxncpy)
bool ui_but_supports_cycling(const uiBut *but)
bool ui_but_is_bool(const uiBut *but)
void ui_but_anim_decorate_update_from_flag(uiButDecorator *but)
void ui_but_anim_flag(uiBut *but, const AnimationEvalContext *anim_eval_context)
void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra)
bool ui_but_anim_expression_get(uiBut *but, char *str, size_t str_maxncpy)
bool ui_but_drag_is_draggable(const uiBut *but)
void ui_but_drag_start(bContext *C, uiBut *but)
void UI_context_update_anim_flag(const bContext *C)
static int ui_do_but_EXIT(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_color_picker_to_rgb_HSVCUBE_v(const uiButHSVCube *hsv_but, const float hsv[3], float rgb[3])
static void ui_do_but_extra_operator_icons_mousemove(uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_but_paste(bContext *C, uiBut *but, uiHandleButtonData *data, const bool paste_array)
static void ui_multibut_states_apply(bContext *C, uiHandleButtonData *data, uiBlock *block)
static void ui_multibut_free(uiHandleButtonData *data, uiBlock *block)
static CurveProfile but_copypaste_profile
static int ui_handle_menu_letter_press_search(uiPopupBlockHandle *menu, const wmEvent *event)
static float ui_numedit_apply_snapf(uiBut *but, float tempf, float softmin, float softmax, const enum eSnapType snap)
bool UI_textbutton_activate_rna(const bContext *C, ARegion *region, const void *rna_poin_data, const char *rna_prop_id)
void UI_context_active_but_prop_handle(bContext *C, const bool handle_undo)
#define BUTTON_FLASH_DELAY
static int ui_handle_menu_event(bContext *C, const wmEvent *event, uiPopupBlockHandle *menu, int level, const bool is_parent_inside, const bool is_parent_menu, const bool is_floating)
static void button_activate_exit(bContext *C, uiBut *but, uiHandleButtonData *data, const bool mousemove, const bool onfree)
static bool ui_numedit_but_CURVE(uiBlock *block, uiBut *but, uiHandleButtonData *data, int evtx, int evty, bool snap, const bool shift)
static void ui_afterfunc_update_preferences_dirty(uiAfterFunc *after)
static bool ui_multibut_states_tag(uiBut *but_active, uiHandleButtonData *data, const wmEvent *event)
static bool ui_but_is_drag_toggle(const uiBut *but)
static bool but_copypaste_curve_alive
static void ui_but_paste_numeric_array(bContext *C, uiBut *but, uiHandleButtonData *data, char *buf_paste)
static bool ui_textedit_copypaste(uiBut *but, uiTextEdit &text_edit, const int mode)
static int ui_do_but_SCROLL(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static char ui_menu_scroll_test(uiBlock *block, int my)
static int ui_do_but_TEX(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
bool ui_but_is_editing(const uiBut *but)
int ui_but_menu_direction(uiBut *but)
static void ui_but_get_pasted_text_from_clipboard(const bool ensure_utf8, char **r_buf_paste, int *r_buf_len)
bool UI_but_active_drop_name(const bContext *C)
static bool ui_mouse_motion_keynav_test(uiKeyNavLock *keynav, const wmEvent *event)
static bool ui_menu_scroll_step(ARegion *region, uiBlock *block, const int scroll_dir)
#define DRAG_MULTINUM_THRESHOLD_DRAG_X
static int ui_region_handler(bContext *C, const wmEvent *event, void *)
static void ui_numedit_apply(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data)
static bool ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, float mx, float my, const enum eSnapType snap, const bool shift)
static void force_activate_view_item_but(bContext *C, ARegion *region, uiButViewItem *but, const bool close_popup=true)
static void ui_but_copy_colorband(uiBut *but)
static bool ui_button_value_default(uiBut *but, double *r_value)
static void ui_but_paste_curvemapping(bContext *C, uiBut *but)
static int ui_handle_button_over(bContext *C, const wmEvent *event, ARegion *region)
static void ui_rgb_to_color_picker_HSVCUBE_compat_v(const uiButHSVCube *hsv_but, const float rgb[3], float hsv[3])
#define MENU_TOWARDS_WIGGLE_ROOM
#define BUTTON_MOUSE_TOWARDS_THRESH
void UI_block_interaction_set(uiBlock *block, uiBlockInteraction_CallbackData *callbacks)
#define UI_MAX_PASSWORD_STR
static void ui_apply_but_ROW(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data)
static bool ui_numedit_but_HISTOGRAM(uiBut *but, uiHandleButtonData *data, int mx, int my)
static void ui_but_copy_numeric_array(uiBut *but, char *output, int output_maxncpy)
static int ui_handle_menu_return_submenu(bContext *C, const wmEvent *event, uiPopupBlockHandle *menu)
static int ui_do_but_BUT(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static CurveMapping but_copypaste_curve
static bool ui_mouse_motion_towards_check(uiBlock *block, uiPopupBlockHandle *menu, const int xy[2], const bool use_wiggle_room)
static void ui_but_copy_numeric_value(uiBut *but, char *output, int output_maxncpy)
float ui_block_calc_pie_segment(uiBlock *block, const float event_xy[2])
static bool ui_rna_is_userdef(PointerRNA *ptr, PropertyRNA *prop)
static int ui_do_but_CURVEPROFILE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static bool ui_textedit_delete(uiBut *but, uiTextEdit &text_edit, eStrCursorJumpDirection direction, eStrCursorJumpType jump)
static int ui_handle_viewlist_items_hover(const wmEvent *event, ARegion *region)
static void with_but_active_as_semi_modal(bContext *C, ARegion *region, uiBut *but, blender::FunctionRef< void()> fn)
static bool ui_afterfunc_check(const uiBlock *block, const uiBut *but)
static uiBut * ui_but_find_open_event(ARegion *region, const wmEvent *event)
static bool but_copypaste_profile_alive
static void button_activate_init(bContext *C, ARegion *region, uiBut *but, uiButtonActivateType type)
static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, int mx, int my, const enum eSnapType snap, const bool shift)
static void ui_but_copy_operator(bContext *C, uiBut *but, char *output, int output_maxncpy)
uiBlock * UI_region_block_find_mouse_over(const ARegion *region, const int xy[2], bool only_clip)
uiBut * UI_region_active_but_get(const ARegion *region)
static void ui_handle_button_activate(bContext *C, ARegion *region, uiBut *but, uiButtonActivateType type)
static bool ui_multibut_drag_wait(const uiHandleButtonMulti &multi_data)
void ui_but_activate_over(bContext *C, ARegion *region, uiBut *but)
static void ui_multibut_states_create(uiBut *but_active, uiHandleButtonData *data)
static bool ui_event_is_snap(const wmEvent *event)
static bool ui_do_but_extra_operator_icon(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static int ui_do_but_COLOR(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
ARegion * UI_region_searchbox_region_get(const ARegion *button_region)
static bool ui_can_activate_other_menu(uiBut *but, uiBut *but_other, const wmEvent *event)
static uiBut * ui_block_pie_dir_activate(uiBlock *block, const wmEvent *event, RadialDirection dir)
static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
bool UI_but_is_userdef(const uiBut *but)
static void ui_selectcontext_apply(bContext *C, uiBut *but, uiSelectContextStore *selctx_data, const double value, const double value_orig)
uiBut * UI_region_but_find_rect_over(const ARegion *region, const rcti *rect_px)
static void ui_but_set_float_array(bContext *C, uiBut *but, uiHandleButtonData *data, const float *values, const int values_len)
static int ui_but_pie_menu_apply(bContext *C, uiPopupBlockHandle *menu, uiBut *but, bool force_close)
static void ui_apply_but_TRACKPREVIEW(bContext *C, uiBut *but, uiHandleButtonData *data)
static bool ui_textedit_delete_selection(uiBut *but, uiTextEdit &text_edit)
static int ui_do_but_GRIP(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_apply_but_CURVEPROFILE(bContext *C, uiBut *but, uiHandleButtonData *data)
#define DRAG_MULTINUM_THRESHOLD_DRAG_Y
static bool ui_do_but_ANY_drag_toggle(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event, int *r_retval)
#define UI_PROP_SCALE_LOG_SNAP_OFFSET
static int ui_handle_region_semi_modal_buttons(bContext *C, const wmEvent *event, ARegion *region)
static void popup_check(bContext *C, wmOperator *op)
static void ui_apply_but_WAVEFORM(bContext *C, uiBut *but, uiHandleButtonData *data)
static void ui_but_paste_color(bContext *C, uiBut *but, char *buf_paste)
static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static bool ui_menu_scroll_to_y(ARegion *region, uiBlock *block, int y)
static void ui_numedit_begin_set_values(uiBut *but, uiHandleButtonData *data)
static bool ui_drag_toggle_but_is_supported(const uiBut *but)
static void ui_palette_set_active(uiButColor *color_but)
static bool ui_but_pie_menu_supported_apply(uiBut *but)
static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *event)
static eStrCursorJumpType ui_textedit_jump_type_from_event(const wmEvent *event)
static void ui_region_auto_open_clear(ARegion *region)
static void ui_rna_update_preferences_dirty(PointerRNA *ptr, PropertyRNA *prop)
void UI_but_tooltip_timer_remove(bContext *C, uiBut *but)
void UI_popup_menu_retval_set(const uiBlock *block, const int retval, const bool enable)
static int ui_drag_toggle_but_pushed_state(uiBut *but)
static int ui_do_but_CURVE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static int ui_do_but_LISTROW(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_apply_but_CURVE(bContext *C, uiBut *but, uiHandleButtonData *data)
void ui_but_execute_end(bContext *C, ARegion *, uiBut *but, void *active_back)
static void ui_textedit_string_set(uiBut *but, uiTextEdit &text_edit, const char *str)
static bool button_modal_state(uiHandleButtonState state)
static float ui_mouse_scale_warp_factor(const bool shift)
uiBut * UI_context_active_but_get(const bContext *C)
static void ui_apply_but_IMAGE(bContext *C, uiBut *but, uiHandleButtonData *data)
static ListBase UIAfterFuncs
static bool ui_numedit_but_NUM(uiButNumber *but, uiHandleButtonData *data, int mx, blender::FunctionRef< int()> drag_threshold_fn, const bool is_motion, const enum eSnapType snap, float fac)
static void ui_block_open_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
void ui_but_active_free(const bContext *C, uiBut *but)
static void ui_color_snap_hue(const enum eSnapType snap, float *r_hue)
static void ui_menu_scroll_apply_offset_y(ARegion *region, uiBlock *block, float dy)
void ui_but_active_string_clear_and_exit(bContext *C, uiBut *but)
static uiBut * ui_context_button_active(const ARegion *region, bool(*but_check_cb)(const uiBut *))
static void ui_apply_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data)
static void ui_textedit_prev_but(uiBlock *block, uiBut *actbut, uiHandleButtonData *data)
@ BUTTON_STATE_WAIT_FLASH
@ BUTTON_STATE_NUM_EDITING
@ BUTTON_STATE_TEXT_EDITING
@ BUTTON_STATE_TEXT_SELECTING
@ BUTTON_STATE_WAIT_KEY_EVENT
@ BUTTON_STATE_WAIT_RELEASE
static int ui_do_but_SEARCH_UNLINK(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_apply_but_NUM(bContext *C, uiBut *but, uiHandleButtonData *data)
static void ui_but_paste_numeric_value(bContext *C, uiBut *but, uiHandleButtonData *data, char *buf_paste)
static void ui_numedit_end(uiBut *but, uiHandleButtonData *data)
static bool ui_but_copy_menu(uiBut *but, char *output, int output_maxncpy)
static void ui_apply_but_VIEW_ITEM(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data)
static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_but_extra_operator_icon_apply(bContext *C, uiBut *but, uiButExtraOpIcon *op_icon)
static void ui_but_paste_normalized_vector(bContext *C, uiBut *but, uiHandleButtonData *data, char *buf_paste)
#define UI_PROP_SCALE_LOG_MIN
static void ui_but_update_preferences_dirty(uiBut *but)
static void float_array_to_string(const float *values, const int values_len, char *output, int output_maxncpy)
void ui_pan_to_scroll(const wmEvent *event, int *type, int *val)
static int ui_do_but_HISTOGRAM(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static int ui_list_get_increment(const uiList *ui_list, const int type, const int columns)
static int ui_do_but_WAVEFORM(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_apply_but_func(bContext *C, uiBut *but)
static void ui_mouse_scale_warp(uiHandleButtonData *data, const float mx, const float my, float *r_mx, float *r_my, const bool shift)
static void ui_apply_but_COLORBAND(bContext *C, uiBut *but, uiHandleButtonData *data)
uiBut * UI_context_active_but_prop_get(const bContext *C, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index)
static bool ui_numedit_but_CURVEPROFILE(uiBlock *block, uiBut *but, uiHandleButtonData *data, int evtx, int evty, bool snap, const bool shift)
static bool ui_drag_toggle_set_xy_xy(bContext *C, ARegion *region, const int pushed_state, const int xy_src[2], const int xy_dst[2])
static void ui_apply_but_VEC(bContext *C, uiBut *but, uiHandleButtonData *data)
static void ui_block_interaction_update(bContext *C, uiBlockInteraction_CallbackData *callbacks, uiBlockInteraction_Handle *interaction)
static bool ui_numedit_but_UNITVEC(uiBut *but, uiHandleButtonData *data, int mx, int my, const enum eSnapType snap)
static void ui_apply_but_BUTM(bContext *C, uiBut *but, uiHandleButtonData *data)
static enum eSnapType ui_event_to_snap(const wmEvent *event)
static void ui_handler_region_drag_toggle_remove(bContext *, void *userdata)
static ARegion * ui_but_tooltip_init(bContext *C, ARegion *region, int *pass, double *r_pass_delay, bool *r_exit_on_event)
void ui_but_handle_data_free(uiHandleButtonData **data)
uiBut * ui_but_find_select_in_enum(uiBut *but, int direction)
void ui_but_execute_begin(bContext *, ARegion *region, uiBut *but, void **active_back)
#define MENU_SCROLL_INTERVAL
static void ui_apply_but_BUT(bContext *C, uiBut *but, uiHandleButtonData *data)
#define MENU_TOWARDS_MARGIN
static void ui_selectcontext_end(uiBut *but, uiSelectContextStore *selctx_data)
static int ui_do_but_TRACKPREVIEW(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
bool UI_textbutton_activate_but(const bContext *C, uiBut *actbut)
void UI_context_active_but_clear(bContext *C, wmWindow *win, ARegion *region)
static int ui_handle_menu_button(bContext *C, const wmEvent *event, uiPopupBlockHandle *menu)
static uiBut * ui_but_list_row_text_activate(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event, uiButtonActivateType activate_type)
static void ui_numedit_set_active(uiBut *but)
static ColorBand but_copypaste_coba
static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static bool ui_but_dragedit_update_mval(uiHandleButtonData *data, int mx, blender::FunctionRef< int()> drag_threshold_fn)
static uiBlockInteraction_Handle * ui_block_interaction_begin(bContext *C, uiBlock *block, const bool is_click)
static bool point_draw_handles(CurveProfilePoint *point)
static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState state)
static void ui_apply_but_autokey(bContext *C, uiBut *but)
static void ui_mouse_motion_keynav_init(uiKeyNavLock *keynav, const wmEvent *event)
static bool ui_but_drag_init(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
@ BUTTON_ACTIVATE_TEXT_EDITING
static bool ui_numedit_but_TRACKPREVIEW(bContext *C, uiBut *but, uiHandleButtonData *data, int mx, int my, const bool shift)
uiBut * UI_but_active_drop_name_button(const bContext *C)
uiBut * UI_context_active_but_get_respect_popup(const bContext *C)
static void ui_apply_but_undo(uiBut *but)
static float ui_numedit_apply_snap(int temp, float softmin, float softmax, const enum eSnapType snap)
#define DRAG_MULTINUM_THRESHOLD_VERTICAL
static bool ui_but_copy(bContext *C, uiBut *but, const bool copy_array)
static void ui_textedit_end(bContext *C, uiBut *but, uiHandleButtonData *data)
static void ui_numedit_begin(uiBut *but, uiHandleButtonData *data)
static bool ui_but_copy_popover(uiBut *but, char *output, int output_maxncpy)
void ui_handle_afterfunc_add_operator(wmOperatorType *ot, blender::wm::OpCallContext opcontext)
#define UI_DRAG_MAP_SOFT_RANGE_PIXEL_MAX
static int ui_do_but_VIEW_ITEM(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
void ui_but_clipboard_free()
static int ui_do_but_text_value_cycle(bContext *C, uiBut *but, uiHandleButtonData *data, const int inc_value)
static void ui_textedit_set_cursor_select(uiBut *but, uiHandleButtonData *data, const float x)
void ui_but_activate_event(bContext *C, ARegion *region, uiBut *but)
static int ui_handler_region_drag_toggle(bContext *C, const wmEvent *event, void *userdata)
static int ui_handle_list_event(bContext *C, const wmEvent *event, ARegion *region, uiBut *listbox)
uiBut * UI_region_active_but_prop_get(const ARegion *region, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index)
static int ui_do_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_handle_button_return_submenu(bContext *C, const wmEvent *event, uiBut *but)
static bool ui_numedit_but_SLI(uiBut *but, uiHandleButtonData *data, int mx, blender::FunctionRef< int()> drag_threshold_fn, const bool is_horizontal, const bool is_motion, const bool snap, const bool shift)
static void ui_textedit_next_but(uiBlock *block, uiBut *actbut, uiHandleButtonData *data)
static void ui_multibut_add(uiHandleButtonData *data, uiBut *but)
void UI_but_tooltip_refresh(bContext *C, uiBut *but)
#define IS_ALLSELECT_EVENT(event)
static bool ui_handle_button_activate_by_type(bContext *C, ARegion *region, uiBut *but)
static bool parse_float_array(char *text, float *values, int values_len_expected)
bool UI_but_active_drop_color(bContext *C)
static int ui_do_but_TAB(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_block_open_end(bContext *C, uiBut *but, uiHandleButtonData *data)
static void ui_textedit_move(uiBut *but, uiTextEdit &text_edit, eStrCursorJumpDirection direction, const bool select, eStrCursorJumpType jump)
#define UI_BUT_IS_SELECT_CONTEXT
static void ui_mouse_motion_towards_init(uiPopupBlockHandle *menu, const int xy[2])
static void ui_mouse_motion_towards_init_ex(uiPopupBlockHandle *menu, const int xy[2], const bool force)
static void ui_apply_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data)
static int ui_handle_view_item_event(bContext *C, const wmEvent *event, uiBut *active_but, ARegion *region)
static void ui_but_copy_CurveProfile(uiBut *but)
static void ui_drag_toggle_set(bContext *C, uiDragToggleHandle *drag_info, const int xy_input[2])
static void ui_apply_but(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const bool interactive)
static void ui_apply_but_HISTOGRAM(bContext *C, uiBut *but, uiHandleButtonData *data)
void UI_screen_free_active_but_highlight(const bContext *C, bScreen *screen)
static void ui_but_paste_CurveProfile(bContext *C, uiBut *but)
static void clamp_axis_max_v3(float v[3], const float max)
#define CASE_NUM_TO_DIR(n, d)
static int ui_do_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static uiButMultiState * ui_multibut_lookup(uiHandleButtonData *data, const uiBut *but)
static void ui_rgb_to_color_picker_HSVCUBE_v(const uiButHSVCube *hsv_but, const float rgb[3], float hsv[3])
static void ui_apply_but_TEX(bContext *C, uiBut *but, uiHandleButtonData *data)
void ui_but_update_view_for_active(const bContext *C, const uiBlock *block)
static int ui_text_position_to_hidden(uiBut *but, int pos)
static int ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_apply_but_funcs_after(bContext *C)
void ui_but_set_string_interactive(bContext *C, uiBut *but, const char *value)
#define BUTTON_KEYNAV_PX_LIMIT
static int ui_popup_handler(bContext *C, const wmEvent *event, void *userdata)
static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_textedit_string_ensure_max_length(uiBut *but, uiTextEdit &text_edit, int str_maxncpy)
static int ui_do_but_COLORBAND(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static int get_but_property_array_length(uiBut *but)
#define PIE_MENU_INTERVAL
static int ui_text_position_from_hidden(uiBut *but, int pos)
static void ui_multibut_restore(bContext *C, uiHandleButtonData *data, uiBlock *block)
static void ui_but_paste_colorband(bContext *C, uiBut *but, uiHandleButtonData *data)
static void ui_but_copy_curvemapping(uiBut *but)
static int ui_do_but_SLI(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_but_copy_text(uiBut *but, char *output, int output_maxncpy)
static bool ui_menu_pass_event_to_parent_if_nonactive(uiPopupBlockHandle *menu, const uiBut *but, const int level, const bool is_parent_menu, const int retval)
static int ui_but_pie_button_activate(bContext *C, uiBut *but, uiPopupBlockHandle *menu)
void UI_popup_handlers_remove(ListBase *handlers, uiPopupBlockHandle *popup)
static void foreach_semi_modal_but_as_active(bContext *C, ARegion *region, blender::FunctionRef< void(uiBut *semi_modal_but)> fn)
static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but)
wmOperator * UI_context_active_operator_get(const bContext *C)
static void ui_textedit_set_cursor_pos(uiBut *but, const ARegion *region, const float x)
static void ui_blocks_set_tooltips(ARegion *region, const bool enable)
static void ui_popup_handler_remove(bContext *C, void *userdata)
static void ui_mouse_motion_towards_reinit(uiPopupBlockHandle *menu, const int xy[2])
void ui_but_semi_modal_state_free(const bContext *C, uiBut *but)
static int ui_do_but_UNITVEC(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
void UI_region_handlers_add(ListBase *handlers)
static int ui_do_but_textedit_select(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static int ui_textedit_autocomplete(bContext *C, uiBut *but, uiHandleButtonData *data)
void ui_but_text_password_hide(char password_str[UI_MAX_PASSWORD_STR], uiBut *but, const bool restore)
static bool ui_but_find_select_in_enum__cmp(const uiBut *but_a, const uiBut *but_b)
static int ui_handle_menus_recursive(bContext *C, const wmEvent *event, uiPopupBlockHandle *menu, int level, const bool is_parent_inside, const bool is_parent_menu, const bool is_floating)
static bool ui_numedit_but_COLORBAND(uiBut *but, uiHandleButtonData *data, int mx)
static void ui_region_handler_remove(bContext *C, void *)
static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void button_tooltip_timer_reset(bContext *C, uiBut *but)
static bool ui_textedit_insert_buf(uiBut *but, uiTextEdit &text_edit, const char *buf, int buf_len)
void UI_popup_handlers_add(bContext *C, ListBase *handlers, uiPopupBlockHandle *popup, const char flag)
static void ui_block_interaction_begin_ensure(bContext *C, uiBlock *block, uiHandleButtonData *data, const bool is_click)
static void ui_block_interaction_end(bContext *C, uiBlockInteraction_CallbackData *callbacks, uiBlockInteraction_Handle *interaction)
static bool ui_menu_scroll_to_but(ARegion *region, uiBlock *block, uiBut *but_target)
void UI_region_free_active_but_all(bContext *C, ARegion *region)
static bool ui_numedit_but_WAVEFORM(uiBut *but, uiHandleButtonData *data, int mx, int my)
#define BUTTON_AUTO_OPEN_THRESH
static int ui_handler_region_menu(bContext *C, const wmEvent *event, void *userdata)
static uiAfterFunc * ui_afterfunc_new()
static uiButExtraOpIcon * ui_but_extra_operator_icon_mouse_over_get(uiBut *but, ARegion *region, const wmEvent *event)
static int ui_pie_handler(bContext *C, const wmEvent *event, uiPopupBlockHandle *menu)
static void ui_but_paste_text(bContext *C, uiBut *but, uiHandleButtonData *data, char *buf_paste)
static bool ui_selectcontext_begin(bContext *C, uiBut *but, uiSelectContextStore *selctx_data)
void UI_popup_handlers_remove_all(bContext *C, ListBase *handlers)
static void ui_but_copy_color(uiBut *but, char *output, int output_maxncpy)
static void ui_handle_afterfunc_add_operator_ex(wmOperatorType *ot, PointerRNA **properties, blender::wm::OpCallContext opcontext, const uiBut *context_but)
static void ui_apply_but_TAB(bContext *C, uiBut *but, uiHandleButtonData *data)
bool ui_but_contains_point_px(const uiBut *but, const ARegion *region, const int xy[2]) ATTR_NONNULL(1
ARegion ARegion * ui_screen_region_find_mouse_over(bScreen *screen, const wmEvent *event)
void ui_hsvcircle_vals_from_pos(const rcti *rect, float mx, float my, float *r_val_rad, float *r_val_dist)
bool ui_but_is_cursor_warp(const uiBut *but) ATTR_WARN_UNUSED_RESULT
size_t ui_but_drawstr_len_without_sep_char(const uiBut *but)
uiBlock * ui_block_find_mouse_over_ex(const ARegion *region, const int xy[2], bool only_clip) ATTR_NONNULL(1
uiBut * ui_block_active_but_get(const uiBlock *block)
void ui_searchbox_update(bContext *C, ARegion *region, uiBut *but, bool reset)
@ UI_PIE_ANIMATION_FINISHED
@ UI_PIE_INITIAL_DIRECTION
@ UI_PIE_GESTURE_END_WAIT
void ui_perceptual_to_scene_linear_space(uiBut *but, float rgb[3])
uiBlock *(*)(bContext *C, uiPopupBlockHandle *handle, void *arg1) uiBlockHandleCreateFunc
void ui_color_picker_hsv_to_rgb(const float r_cp[3], float rgb[3])
bool ui_block_is_pie_menu(const uiBlock *block) ATTR_WARN_UNUSED_RESULT
void ui_popup_block_scrolltest(uiBlock *block)
bool ui_but_has_array_value(const uiBut *but) ATTR_WARN_UNUSED_RESULT
#define UI_BITBUT_VALUE_TOGGLED(a, b)
bool int ui_searchbox_find_index(ARegion *region, const char *name)
size_t ui_but_tip_len_only_first_line(const uiBut *but)
uiBut * ui_view_item_find_mouse_over(const ARegion *region, const int xy[2]) ATTR_NONNULL(1
void ui_hsvcircle_pos_from_vals(const ColorPicker *cpicker, const rcti *rect, const float *hsv, float *r_xpos, float *r_ypos)
bool ui_but_contains_point_px_icon(const uiBut *but, ARegion *region, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
bool ui_block_is_popup_any(const uiBlock *block) ATTR_WARN_UNUSED_RESULT
bool ui_layout_panel_toggle_open(const bContext *C, LayoutPanelHeader *header)
uiPopupBlockHandle * ui_popup_block_create(bContext *C, ARegion *butregion, uiBut *but, uiBlockCreateFunc create_func, uiBlockHandleCreateFunc handle_create_func, void *arg, uiFreeArgFunc arg_free, bool can_refresh)
uiPopupBlockHandle * ui_popup_menu_create(bContext *C, ARegion *butregion, uiBut *but, uiMenuCreateFunc menu_func, void *arg)
int ui_handler_panel_region(bContext *C, const wmEvent *event, ARegion *region, const uiBut *active_but)
void ui_hsvcube_pos_from_vals(const uiButHSVCube *hsv_but, const rcti *rect, const float *hsv, float *r_xp, float *r_yp)
void ui_scene_linear_to_perceptual_space(uiBut *but, float rgb[3])
void ui_popup_block_free(bContext *C, uiPopupBlockHandle *handle)
void ui_searchbox_free(bContext *C, ARegion *region)
#define PIE_CLICK_THRESHOLD_SQ
int ui_but_menu_step(uiBut *but, int direction)
uiBut * ui_but_find_rect_over(const ARegion *region, const rcti *rect_px) ATTR_WARN_UNUSED_RESULT
bool ui_region_contains_point_px(const ARegion *region, const int xy[2]) ATTR_NONNULL(1
bool ui_searchbox_apply(uiBut *but, ARegion *region)
void ui_popup_translate(ARegion *region, const int mdiff[2])
bool ui_block_is_menu(const uiBlock *block) ATTR_WARN_UNUSED_RESULT
uiBut * ui_view_item_find_search_highlight(const ARegion *region)
#define UI_MENU_SCROLL_PAD
uiBut * ui_region_find_first_but_test_flag(ARegion *region, int flag_include, int flag_exclude)
const char * ui_textedit_undo(uiUndoStack_Text *stack, int direction, int *r_cursor_index)
void ui_but_hsv_set(uiBut *but)
LayoutPanelHeader * ui_layout_panel_header_under_mouse(const Panel &panel, const int my)
bool ui_searchbox_inside(ARegion *region, const int xy[2]) ATTR_NONNULL(1
uiBut * ui_but_first(uiBlock *block) ATTR_WARN_UNUSED_RESULT
#define UI_MENU_SCROLL_ARROW
bool ui_but_contains_pt(const uiBut *but, float mx, float my) ATTR_WARN_UNUSED_RESULT
uiBut * ui_list_find_mouse_over(const ARegion *region, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
blender::StringRef ui_but_drawstr_without_sep_char(const uiBut *but) ATTR_NONNULL()
bool ui_searchbox_event(bContext *C, ARegion *region, uiBut *but, ARegion *butregion, const wmEvent *event)
bool ui_but_contains_password(const uiBut *but) ATTR_WARN_UNUSED_RESULT
uiBut * ui_but_find_mouse_over_ex(const ARegion *region, const int xy[2], bool labeledit, bool for_tooltip, const uiButFindPollFn find_poll, const void *find_custom_data) ATTR_NONNULL(1
bool ui_but_is_editable(const uiBut *but) ATTR_WARN_UNUSED_RESULT
uiBut * ui_list_row_find_mouse_over(const ARegion *region, const int xy[2]) ATTR_NONNULL(1
uiBlock * ui_block_func_COLOR(bContext *C, uiPopupBlockHandle *handle, void *arg_but)
bool ui_but_is_interactive(const uiBut *but, bool labeledit) ATTR_WARN_UNUSED_RESULT
void ui_color_picker_rgb_to_hsv_compat(const float rgb[3], float r_cp[3])
void ui_popup_menu_memory_set(uiBlock *block, uiBut *but)
uiBut * ui_but_last(uiBlock *block) ATTR_WARN_UNUSED_RESULT
uiPopupBlockHandle * ui_popover_panel_create(bContext *C, ARegion *butregion, uiBut *but, uiPopoverCreateFunc popover_func, const PanelType *panel_type)
uiBut * ui_region_find_active_but(ARegion *region) ATTR_WARN_UNUSED_RESULT
void ui_but_pie_dir(RadialDirection dir, float vec[2])
uiBut * ui_but_next(uiBut *but) ATTR_WARN_UNUSED_RESULT
void ui_textedit_undo_stack_destroy(uiUndoStack_Text *stack)
bool ui_but_is_popover_once_compat(const uiBut *but) ATTR_WARN_UNUSED_RESULT
bool ui_but_is_editable_as_text(const uiBut *but) ATTR_WARN_UNUSED_RESULT
uiUndoStack_Text * ui_textedit_undo_stack_create()
bool ui_but_color_has_alpha(uiBut *but)
void ui_textedit_undo_push(uiUndoStack_Text *stack, const char *text, int cursor_index)
void ui_panel_drag_collapse_handler_add(const bContext *C, const bool was_open)
uiBut * ui_but_prev(uiBut *but) ATTR_WARN_UNUSED_RESULT
int ui_searchbox_autocomplete(bContext *C, ARegion *region, uiBut *but, char *str)
void ui_layout_panel_popup_scroll_apply(Panel *panel, const float dy)
#define UI_MENU_SCROLL_MOUSE
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
MINLINE size_t min_zz(size_t a, size_t b)
void add_recent_search(StringRef chosen_str)
bool block_layout_needs_resolving(const uiBlock *block)
VecBase< int32_t, 2 > int2
static void update(bNodeTree *ntree)
vector snap(vector a, vector b)
static void init(bNodeTree *, bNode *node)
float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_float_get_default_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, bool value)
void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value)
bool RNA_property_array_check(PropertyRNA *prop)
bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
int RNA_property_int_get_default(PointerRNA *ptr, PropertyRNA *prop)
int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value, ReportList *reports)
float RNA_property_float_get_default_index(PointerRNA *ptr, PropertyRNA *prop, int index)
void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax)
PropertyType RNA_property_type(PropertyRNA *prop)
const PointerRNA PointerRNA_NULL
void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_float_get_array_at_most(PointerRNA *ptr, PropertyRNA *prop, float *values, int values_num)
void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
int RNA_property_int_get_default_index(PointerRNA *ptr, PropertyRNA *prop, int index)
bool RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_float_set_array_at_most(PointerRNA *ptr, PropertyRNA *prop, const float *values, int values_num)
float RNA_property_float_get_default(PointerRNA *ptr, PropertyRNA *prop)
int RNA_property_flag(PropertyRNA *prop)
void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, bool value)
int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
StructRNA * RNA_struct_base(StructRNA *type)
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
std::string RNA_property_string_get(PointerRNA *ptr, PropertyRNA *prop)
PropertySubType RNA_property_subtype(PropertyRNA *prop)
void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, int *hardmax)
bool RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
const char * RNA_property_identifier(const PropertyRNA *prop)
void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const bool *values)
PointerRNA RNA_id_pointer_create(ID *id)
void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *value)
ARegionRuntimeHandle * runtime
struct ColorBand * gradient
float luminosity_lock_value
CurveProfilePoint * table
struct MovieTrackingMarker * marker
struct MovieTrackingTrack * track
char idname[BKE_ST_MAXNAME]
struct wmTooltipState * tool_tip
std::optional< bContextStore > context
char undostr[BKE_UNDO_STR_MAX]
uiBlockInteraction_Handle * custom_interaction_handle
blender::wm::OpCallContext opcontext
std::string rename_full_new
std::function< void(bContext &)> apply_func
std::function< void(std::string &new_name)> rename_full_func
uiBlockInteraction_CallbackData custom_interaction_callbacks
uiButArgNFree func_argN_free_fn
uiBlockHandleFunc handle_func
uiButHandleRenameFunc rename_func
uiFreeArgFunc search_arg_free_fn
uiBlockInteractionBeginFn begin_fn
uiBlockInteractionEndFn end_fn
uiBlockInteractionUpdateFn update_fn
uiBlockInteraction_Params params
uint unique_retval_ids_len
blender::Vector< std::unique_ptr< uiBut > > buttons
uiPopupBlockHandle * handle
uiBlockHandleFunc handle_func
int but_index(const uiBut *but) const
uiBlockInteraction_CallbackData custom_interaction_callbacks
const UnitSettings * unit
uiBut * next_but(const uiBut *but) const
int(* block_event_func)(const bContext *C, uiBlock *, const wmEvent *)
uiBut * prev_but(const uiBut *but) const
CurveMapping * edit_cumap
CurveProfile * edit_profile
bool toggle_keyframe_on_click
eButGradientType gradient_type
wmEventModifierFlag modifier_key
uiSelectContextStore select_others
bool results_are_suggestions
uiButSearchCreateFn popup_create_fn
uiFreeArgFunc arg_free_fn
blender::ui::AbstractViewItem * view_item
uiButCompleteFunc autocomplete_func
std::function< void(bContext &)> apply_func
blender::ui::EmbossType emboss
uiHandleButtonData * active
uiMenuCreateFunc menu_create_func
std::function< void(std::string &new_name)> rename_full_func
blender::wm::OpCallContext opcontext
std::string rename_full_new
const bContextStore * context
uiButArgNFree func_argN_free_fn
uiButHandleHoldFunc hold_func
uiButHandleRenameFunc rename_func
uiBlockCreateFunc block_create_func
uiButArgNCopy func_argN_copy_fn
uiHandleButtonData * semi_modal_state
int * items_filter_neworder
void(* popup_func)(bContext *C, void *arg, int event)
void(* cancel_func)(bContext *C, void *arg)
uiPopupBlockCreate popup_create_vars
uiKeyNavLock keynav_state
blender::Vector< uiSelectContextElem > elems
uiUndoStack_Text * undo_stack_text
wmUIHandlerRemoveFunc remove_fn
wmUIHandlerFunc handle_fn
eWM_EventHandlerType type
wmEventModifierFlag modifier
blender::wm::OpCallContext opcontext
bool(* check)(bContext *C, wmOperator *op)
struct wmOperatorType * type
WindowManagerRuntimeHandle * runtime
WindowRuntimeHandle * runtime
short pie_event_type_lock
struct wmEvent * eventstate
short pie_event_type_last
void WM_operator_stack_clear(wmWindowManager *wm)
void WM_cursor_modal_set(wmWindow *win, int val)
void WM_cursor_set(wmWindow *win, int curs)
void WM_cursor_modal_restore(wmWindow *win)
void WM_cursor_grab_enable(wmWindow *win, const eWM_CursorWrapAxis wrap, const rcti *wrap_region, const bool hide)
void WM_cursor_grab_disable(wmWindow *win, const int mouse_ungrab_xy[2])
void WM_event_start_drag(bContext *C, int icon, eWM_DragDataType type, void *poin, uint flags)
int WM_event_absolute_delta_y(const wmEvent *event)
int WM_event_drag_threshold(const wmEvent *event)
void WM_operator_name_call_ptr_with_depends_on_cursor(bContext *C, wmOperatorType *ot, blender::wm::OpCallContext opcontext, PointerRNA *properties, const wmEvent *event, const StringRef drawstr)
wmEventHandler_UI * WM_event_add_ui_handler(const bContext *C, ListBase *handlers, wmUIHandlerFunc handle_fn, wmUIHandlerRemoveFunc remove_fn, void *user_data, const eWM_EventHandlerFlag flag)
void WM_global_report(eReportType type, const char *message)
void WM_event_free_ui_handler_all(bContext *C, ListBase *handlers, wmUIHandlerFunc handle_fn, wmUIHandlerRemoveFunc remove_fn)
void WM_main_add_notifier(uint type, void *reference)
void WM_event_remove_ui_handler(ListBase *handlers, wmUIHandlerFunc handle_fn, wmUIHandlerRemoveFunc remove_fn, void *user_data, const bool postpone)
void WM_global_reportf(eReportType type, const char *format,...)
void WM_report_banner_show(wmWindowManager *wm, wmWindow *win)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void wm_event_handler_ui_cancel_ex(bContext *C, wmWindow *win, ARegion *region, bool reactivate_button)
void wm_event_init_from_window(wmWindow *win, wmEvent *event)
void WM_event_add_mousemove(wmWindow *win)
#define ISMOUSE_BUTTON(event_type)
#define ISMOUSE_MOTION(event_type)
#define ISKEYBOARD(event_type)
#define ISHOTKEY(event_type)
void WM_gestures_remove(wmWindow *win)
const char * WM_key_event_string(const short type, const bool compact)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
std::string WM_operator_pystring_ex(bContext *C, wmOperator *op, const bool all_args, const bool macro_args, wmOperatorType *ot, PointerRNA *opptr)
void WM_operator_properties_create_ptr(PointerRNA *ptr, wmOperatorType *ot)
std::optional< std::string > WM_prop_pystring_assign(bContext *C, PointerRNA *ptr, PropertyRNA *prop, int index)
void WM_operator_properties_free(PointerRNA *ptr)
PanelType * WM_paneltype_find(const StringRef idname, bool quiet)
bool WM_stereo3d_enabled(wmWindow *win, bool skip_stereo3d_check)
void WM_clipboard_text_set(const char *buf, bool selection)
char * WM_clipboard_text_get_firstline(bool selection, bool ensure_utf8, int *r_len)
wmTimer * WM_event_timer_add(wmWindowManager *wm, wmWindow *win, const wmEventType event_type, const double time_step)
void WM_event_timer_remove(wmWindowManager *wm, wmWindow *, wmTimer *timer)
bScreen * WM_window_get_active_screen(const wmWindow *win)