71#include "RNA_prototypes.hh"
93#define USE_CONT_MOUSE_CORRECT
95#define USE_DRAG_TOGGLE
98#define USE_DRAG_MULTINUM
107#define USE_KEYNAV_LIMIT
110#define USE_DRAG_POPUP
122#define UI_MAX_PASSWORD_STR 128
134#define UI_PROP_SCALE_LOG_MIN 0.5e-8f
140#define UI_PROP_SCALE_LOG_SNAP_OFFSET 0.03f
153#define UI_DRAG_MAP_SOFT_RANGE_PIXEL_MAX 1000
172 const bool is_click);
175 const bool is_click);
183#ifdef USE_KEYNAV_LIMIT
200#define BUTTON_FLASH_DELAY 0.020
201#define MENU_SCROLL_INTERVAL 0.1
202#define PIE_MENU_INTERVAL 0.01
203#define BUTTON_AUTO_OPEN_THRESH 0.2
204#define BUTTON_MOUSE_TOWARDS_THRESH 1.0
206#define BUTTON_KEYNAV_PX_LIMIT 8
209#define MENU_TOWARDS_MARGIN 20
211#define MENU_TOWARDS_WIGGLE_ROOM 64
259# define USE_ALLSELECT_LAYER_HACK
287 const double value_orig);
295# define IS_ALLSELECT_EVENT(event) (((event)->modifier & KM_ALT) != 0)
298# define UI_BUT_IS_SELECT_CONTEXT UI_BUT_NODE_ACTIVE
302#ifdef USE_DRAG_MULTINUM
307# define DRAG_MULTINUM_THRESHOLD_DRAG_X (UI_UNIT_Y / 4)
314# define DRAG_MULTINUM_THRESHOLD_DRAG_Y (UI_UNIT_Y / 4)
324# define DRAG_MULTINUM_THRESHOLD_VERTICAL (0.75f)
463#ifdef USE_CONT_MOUSE_CORRECT
476#ifdef USE_KEYNAV_LIMIT
480#ifdef USE_DRAG_MULTINUM
562#ifdef USE_DRAG_MULTINUM
600 static int lastdy = 0;
608 if ((dy > 0 && lastdy < 0) || (dy < 0 && lastdy > 0)) {
640 uiBut *but_found =
nullptr;
651 but_found = block->
buttons[
i].get();
652 if (direction == 1) {
664 return shift ? 0.05f : 1.0f;
677 *r_mx = (
data->dragstartx * (1.0f - fac) + mx * fac);
678 *r_my = (
data->dragstarty * (1.0f - fac) + my * fac);
687#ifdef USE_DRAG_MULTINUM
690 const bool initializing =
ELEM(
695 return (initializing && vertical_dragging);
706 if (mx ==
data->draglastx) {
710 if (
data->draglock) {
711 const int threshold = drag_threshold_fn();
712 if (
abs(mx -
data->dragstartx) < threshold) {
715#ifdef USE_DRAG_MULTINUM
721 data->draglock =
false;
722 data->dragstartx = mx;
740 if (base ==
nullptr) {
744 &RNA_AddonPreferences,
745 &RNA_KeyConfigPreferences,
747 &RNA_UserAssetLibrary);
759 U.runtime.is_dirty =
true;
802 *r_hue = roundf((*r_hue) * snap_increment) / snap_increment;
815 uiAfterFunc *after = MEM_new<uiAfterFunc>(__func__);
838 const uiBut *context_but)
845 after->
opptr = *properties;
846 *properties =
nullptr;
849 if (context_but && context_but->
context) {
935 but->
opptr =
nullptr;
946 search_but->
arg =
nullptr;
949 if (but->
active !=
nullptr) {
951 if (
data->custom_interaction_handle !=
nullptr) {
990 std::optional<StringRef>
str;
992 bool skip_undo =
false;
1001 else if (!but->
drawstr.empty()) {
1011 if (!
str ||
str->is_empty() || str_len_clip == 0) {
1012 str =
"Unknown Action";
1013 str_len_clip =
str->size();
1022 if (
ELEM(but->
rnaprop, &rna_ID_name, &rna_Object_active_shape_key_index)) {
1035 if (skip_undo ==
false) {
1072 if (!
str.has_value()) {
1101 opptr = *after.
opptr;
1102 MEM_delete(after.
opptr);
1109 (after.
opptr) ? &opptr :
nullptr,
1187 data->applied =
true;
1196 data->applied =
true;
1208 data->applied =
true;
1219 value_toggle = (value == 0.0);
1230 data->applied =
true;
1240 for (
const std::unique_ptr<uiBut> &bt : block->
buttons) {
1248 data->applied =
true;
1256 if (
data->apply_through_extra_icon) {
1272 const uiBut *context_but,
1302 if (!
data->text_edit.edit_string) {
1320 data->text_edit.original_string =
nullptr;
1339 data->applied =
true;
1344 if (
data->text_edit.edit_string) {
1354 data->applied =
true;
1359 if (
data->text_edit.edit_string) {
1372 data->cancel =
true;
1381 data->cancel =
true;
1393 data->applied =
true;
1403 data->applied =
true;
1410 data->applied =
true;
1417 data->applied =
true;
1424 data->applied =
true;
1433#ifdef USE_DRAG_MULTINUM
1442 mbut_state->
but = but;
1444# ifdef USE_ALLSELECT
1458 if (mbut_state->
but == but) {
1468 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
1474# ifdef USE_ALLSELECT
1492# ifdef USE_ALLSELECT
1493 if (
data->multi_data.mbuts) {
1498 MEM_delete(mbut_state);
1507 data->multi_data.mbuts =
nullptr;
1509 if (
data->multi_data.bs_mbuts) {
1511 data->multi_data.bs_mbuts =
nullptr;
1520 bool changed =
false;
1522 seg[0][0] =
data->multi_data.drag_start[0];
1523 seg[0][1] =
data->multi_data.drag_start[1];
1525 seg[1][0] =
event->xy[0];
1526 seg[1][1] =
event->xy[1];
1533 data->multi_data.has_mbuts =
false;
1536 for (
const std::unique_ptr<uiBut> &but : but_active->
block->
buttons) {
1537 bool drag_prev =
false;
1538 bool drag_curr =
false;
1549 if (but_active != but.get()) {
1558 data->multi_data.has_mbuts =
true;
1565 changed |= (drag_prev != drag_curr);
1578 for (
const std::unique_ptr<uiBut> &but : but_active->
block->
buttons) {
1590 if (
data->origvalue != 0.0) {
1591 data->multi_data.is_proportional =
true;
1599 const double value_delta =
data->value -
data->origvalue;
1600 const double value_scale =
data->multi_data.is_proportional ? (
data->value /
data->origvalue) :
1606 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
1613 if (mbut_state ==
nullptr) {
1615 printf(
"%s: Can't find button\n", __func__);
1624# ifdef USE_ALLSELECT
1625 if (
data->select_others.is_enabled) {
1636 but->active->origvalue = mbut_state->
origvalue;
1638 but->active->select_others.do_free =
false;
1643 if (
data->text_edit.edit_string) {
1645 but->active->value =
data->value;
1650 if (
data->multi_data.is_proportional) {
1651 but->active->value = mbut_state->
origvalue * value_scale;
1654 but->active->value = mbut_state->
origvalue + value_delta;
1658 CLAMP(but->active->value,
double(but->softmin),
double(but->softmax));
1673#ifdef USE_DRAG_TOGGLE
1688 ICON_DECORATE_KEYFRAME,
1689 ICON_DECORATE_ANIMATE,
1690 ICON_DECORATE_OVERRIDE);
1724 bContext *
C,
ARegion *region,
const int pushed_state,
const int xy_src[2],
const int xy_dst[2])
1728 bool changed =
false;
1731 float xy_a_block[2] = {float(xy_src[0]), float(xy_src[1])};
1732 float xy_b_block[2] = {float(xy_dst[0]), float(xy_dst[1])};
1737 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
1752 if (pushed_state_but == pushed_state) {
1761 if (
U.runtime.is_dirty ==
false) {
1779 bool do_draw =
false;
1793 const float but_cent_new[2] = {
1820 xy[0] = (drag_info->
xy_lock[0] ==
false) ? xy_input[0] : drag_info->
xy_last[0];
1821 xy[1] = (drag_info->
xy_lock[1] ==
false) ? xy_input[1] : drag_info->
xy_last[1];
1844 switch (event->
type) {
1864 region, drag_info->
xy_init,
true,
false,
nullptr,
nullptr);
1898 bool success =
false;
1912 if (
ptr.data && prop) {
1913 bool use_path_from_id;
1919 std::optional<std::string> path;
1931 path.has_value() ? path->c_str() :
nullptr,
2002 const double value_orig)
2008 const bool use_delta = (selctx_data->
is_copy ==
false);
2010 std::variant<bool, int, float, std::string, PointerRNA> delta,
min,
max;
2016 delta.emplace<
float>(use_delta ? (value - value_orig) : value);
2019 min.emplace<
float>(min_v);
2020 max.emplace<
float>(max_v);
2023 delta.emplace<
int>(int(use_delta ? (value - value_orig) : value));
2026 min.emplace<
int>(min_v);
2027 max.emplace<
int>(max_v);
2052# ifdef USE_ALLSELECT_LAYER_HACK
2066 tmparray[index] =
true;
2086 float other_value = std::get<float>(delta) + (use_delta ? other.
val_f : 0.0f);
2087 CLAMP(other_value, std::get<float>(
min), std::get<float>(
max));
2096 int other_value = std::get<int>(delta) + (use_delta ? other.
val_i : 0);
2097 CLAMP(other_value, std::get<int>(
min), std::get<int>(
max));
2106 const bool other_value = std::get<bool>(delta);
2115 const int other_value = std::get<int>(delta);
2120 const PointerRNA &other_value = std::get<PointerRNA>(delta);
2124 const std::string &other_value = std::get<std::string>(delta);
2151 const int drag_threshold =
min_ii(
2155 if (
abs(
data->dragstartx - event->
xy[0]) +
abs(
data->dragstarty - event->
xy[1]) > drag_threshold)
2158 data->cancel =
true;
2159#ifdef USE_DRAG_TOGGLE
2179 &
data->window->modalhandlers,
2205 if (lock_axis != -1) {
2206 drag_info->
xy_lock[lock_axis] =
true;
2271 data->applied =
true;
2278 data->applied =
true;
2285 data->applied =
true;
2292 data->applied =
true;
2305 if (!
data->applied) {
2309 if (
data->text_edit.edit_string) {
2312 data->text_edit.edit_string =
data->text_edit.original_string;
2313 data->text_edit.original_string =
nullptr;
2322 data->applied_interactive =
true;
2324 else if (
data->applied_interactive) {
2329# ifdef USE_DRAG_MULTINUM
2335 if (
data->select_others.elems.is_empty())
2342 const bool is_array_paste = (
event->val ==
KM_PRESS) &&
2345 if (!is_array_paste) {
2347 data->select_others.is_enabled =
true;
2351 if (
data->select_others.elems.is_empty()) {
2353 data->select_others.elems.clear();
2360 double *editval = but->
editval;
2361 float *editvec = but->
editvec;
2481#ifdef USE_DRAG_MULTINUM
2482 if (
data->multi_data.has_mbuts) {
2484 (
data->multi_data.skip ==
false))
2501 data->origvalue = 0.0;
2521 if (
data->custom_interaction_handle !=
nullptr) {
2542 *r_buf_paste = text;
2576 const int values_len,
2580 const int values_end = values_len - 1;
2583 for (
int i = 0;
i < values_len;
i++) {
2585 output + ofs, output_maxncpy - ofs, (
i != values_end) ?
"%f, " :
"%f]", values[
i]);
2600 BLI_assert(0 <= values_len_expected && values_len_expected <= 4);
2603 const int values_len_actual = sscanf(
2604 text,
"[%f, %f, %f, %f, %f]", &
v[0], &
v[1], &
v[2], &
v[3], &
v[4]);
2606 if (values_len_actual == values_len_expected) {
2607 memcpy(values,
v,
sizeof(
float) * values_len_expected);
2619 if (values_len > 4) {
2650 data->value = value;
2732 if (but->
poin !=
nullptr) {
2748 if (but->
poin !=
nullptr) {
2767 if (but->
poin !=
nullptr) {
2820 char buf[4096] = {0};
2821 const int buf_maxncpy =
sizeof(buf);
2824 bool is_buf_set =
false;
2826 const bool has_required_data = !(but->
poin ==
nullptr && but->
rnapoin.
data ==
nullptr);
2828 switch (but->
type) {
2831 if (!has_required_data) {
2844 if (!has_required_data) {
2852 if (!has_required_data) {
2861 if (!has_required_data) {
2914 int buf_paste_len = 0;
2918 const bool has_required_data = !(but->
poin ==
nullptr && but->
rnapoin.
data ==
nullptr);
2920 switch (but->
type) {
2923 if (!has_required_data) {
2935 if (!has_required_data) {
2942 if (!has_required_data) {
2950 if (!has_required_data) {
2999 const char *strpos = butstr;
3000 const char *str_end = butstr + strlen(butstr);
3001 for (
int i = 0;
i <
pos;
i++) {
3005 return (strpos - butstr);
3029 if (but->
pos >= 0) {
3040 if (but->
pos >= 0) {
3048 memset(butstr,
'*',
len);
3122 const int len = strlen(
str);
3123 bool changed =
false;
3152 float starty_dummy = 0.0f;
3170 startx -=
U.pixelsize / aspect;
3179 str_last = &
str[but->
ofs];
3227 bool changed =
false;
3235 size_t step = buf_len;
3255 memcpy(&
str[but->
pos], buf,
step *
sizeof(
char));
3264#ifdef WITH_INPUT_IME
3268 const char buf[2] = {ascii,
'\0'};
3280 const int len = strlen(
str);
3281 const int pos_prev = but->
pos;
3287 if (has_sel && !
select) {
3302 int pos_i = but->
pos;
3307 if (has_sel ==
false) {
3312 else if (but->
selsta == pos_prev) {
3333 const int len = strlen(
str);
3335 bool changed =
false;
3344 else if (direction) {
3348 else if (but->
pos >= 0 && but->
pos <
len) {
3362 else if (but->
pos > 0) {
3380 char *
str =
data->text_edit.edit_string;
3383 if (
data->searchbox) {
3405 bool changed =
false;
3444#ifdef WITH_INPUT_IME
3458 wm_window_IME_begin(win,
x,
y, 0, 0,
true);
3464 wm_window_IME_end(win);
3467void ui_but_ime_reposition(
uiBut *but,
int x,
int y,
bool complete)
3473 wm_window_IME_begin(
data->window,
x,
y - 4, 0, 0, complete);
3476const wmIMEData *ui_but_ime_data_get(
uiBut *but)
3481 return data->window->runtime->ime_data;
3492 bool no_zero_strip =
false;
3498#if defined(__APPLE__)
3499 const int ctrl_icon = ICON_KEY_COMMAND;
3501 const int ctrl_icon = ICON_EVENT_CTRL;
3504 status.
item(
IFACE_(
"Confirm"), ICON_EVENT_RETURN);
3505 status.
item(
IFACE_(
"Cancel"), ICON_EVENT_ESC);
3508 status.
item(
IFACE_(
"Select All"), ctrl_icon, ICON_EVENT_A);
3509 status.
item(
IFACE_(
"Copy"), ctrl_icon, ICON_EVENT_C);
3510 status.
item(
IFACE_(
"Paste"), ctrl_icon, ICON_EVENT_V);
3514 status.
item(
IFACE_(
"Autocomplete"), ICON_EVENT_TAB);
3517#ifdef USE_DRAG_MULTINUM
3519 if (
data->applied_interactive) {
3521 data->cancel =
true;
3523 data->cancel =
false;
3525 data->applied_interactive =
false;
3532 data->select_others.is_enabled =
true;
3533 data->select_others.is_copy =
true;
3604 if (
data->searchbox) {
3624#ifdef WITH_INPUT_IME
3626 ui_textedit_ime_begin(win, but);
3647 printf(
"%s: invalid utf8 - stripped chars %d\n", __func__, strip);
3651 if (
data->searchbox) {
3652 if (
data->cancel ==
false) {
3666 data->cancel =
true;
3669 data->escapecancel =
true;
3677 data->searchbox =
nullptr;
3693#ifdef WITH_INPUT_IME
3695# if defined(WIN32) || defined(__APPLE__)
3699 ui_textedit_ime_end(win, but);
3721 data->postbut = but;
3727 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
3728 if (but.get() == actbut) {
3733 data->postbut = but.get();
3754 for (
int i = block->
but_index(actbut) - 1;
i >= 0;
i--) {
3758 data->postbut = but;
3766 if (but == actbut) {
3771 data->postbut = but;
3784#if defined(__APPLE__)
3804 bool changed =
false, inbox =
false,
update =
false, skip_undo_push =
false;
3806#ifdef WITH_INPUT_IME
3808 const wmIMEData *ime_data = win->
runtime->ime_data;
3809 const bool is_ime_composing = ime_data && win->
runtime->ime_data_is_composing;
3811 const bool is_ime_composing =
false;
3814 switch (event->
type) {
3817 if (
data->searchbox) {
3818#ifdef USE_KEYNAV_LIMIT
3837 if (
data->is_semi_modal) {
3843 if (
data->searchbox) {
3851#ifdef WITH_INPUT_IME
3853 if (is_ime_composing) {
3857 data->cancel =
true;
3858 data->escapecancel =
true;
3873 if (
data->searchbox) {
3877 bool is_press_in_button =
false;
3879 float mx =
event->xy[0];
3880 float my =
event->xy[1];
3884 is_press_in_button =
true;
3891 if (is_press_in_button) {
3899 else if (inbox ==
false && !
data->is_semi_modal) {
3901 if (
data->searchbox) {
3902 data->cancel =
data->escapecancel =
true;
3911 if (is_press_in_button) {
3912 const int str_len = strlen(text_edit.
edit_string);
3920 but->
pos = short(selend);
3921 but->
selsta = short(selsta);
3922 but->
selend = short(selend);
3924 text_edit.
sel_pos_init = ((selend == str_len) && (selsta != 0)) ? selend : selsta;
3929 else if (inbox && !
data->is_semi_modal) {
3944 if (event->
val ==
KM_PRESS && !is_ime_composing) {
3945 switch (event->
type) {
3949#if defined(__APPLE__)
3980 if (
data->searchbox) {
3981#ifdef USE_KEYNAV_LIMIT
3998 if (
data->searchbox) {
3999#ifdef USE_KEYNAV_LIMIT
4032#if defined(__APPLE__)
4070 const bool is_redo = (
event->modifier &
KM_SHIFT);
4072#
if defined(__APPLE__)
4080 if (undo_str !=
nullptr) {
4084 but->
pos = undo_pos;
4090 skip_undo_push =
true;
4100#ifdef WITH_INPUT_IME
4101 && !is_ime_composing && !WM_event_is_ime_switch(event)
4105 char utf8_buf_override[2] = {
'\0',
'\0'};
4106 const char *utf8_buf =
event->utf8_buf;
4112 utf8_buf_override[0] =
'.';
4113 utf8_buf = utf8_buf_override;
4131#ifdef WITH_INPUT_IME
4140 if (ime_data->result.size()) {
4142 STREQ(ime_data->result.c_str(),
"\xE3\x80\x82"))
4145 ui_textedit_insert_ascii(but,
data,
'.');
4159 if ((skip_undo_push ==
false) && (text_edit.
undo_stack_text !=
nullptr)) {
4172 if (
data->searchbox) {
4179 if (!
data->searchbox) {
4195 switch (event->
type) {
4197 int mx =
event->xy[0];
4198 int my =
event->xy[1];
4233 data->origvalue =
data->startvalue;
4264 float softrange = softmax - softmin;
4277 const float value_step_float_min = 0.1f;
4279 const double value_step = is_float ?
4283 const float softrange_max =
min_ff(
4285 2 * (is_float ?
min_ff(value_step, value_step_float_min) *
4286 (drag_map_softrange_max / value_step_float_min) :
4287 drag_map_softrange_max));
4289 if (softrange > softrange_max) {
4291 softmin =
data->origvalue - (softrange_max / 2);
4292 softmax =
data->origvalue + (softrange_max / 2);
4293 if (!isfinite(softmin)) {
4296 if (!isfinite(softmax)) {
4300 if (softmin < but->softmin) {
4302 softmax = softmin + softrange_max;
4304 else if (softmax > but->
softmax) {
4306 softmin = softmax - softrange_max;
4310 if (
UNLIKELY(softmin == softmax)) {
4311 if (
data->origvalue > 0.0) {
4312 softmin = nextafterf(softmin, -
FLT_MAX);
4315 softmax = nextafterf(softmax,
FLT_MAX);
4319 softrange = softmax - softmin;
4323 if (softrange == 0.0f) {
4324 data->dragfstart = 0.0f;
4327 switch (scale_type) {
4329 data->dragfstart = (float(
data->value) - softmin) / softrange;
4334 const float base = softmax / log_min;
4339 const float cubic_min =
cube_f(softmin);
4340 const float cubic_max =
cube_f(softmax);
4341 const float cubic_range = cubic_max - cubic_min;
4342 const float f = (float(
data->value) - softmin) * cubic_range / softrange + cubic_min;
4343 data->dragfstart = (cbrtf(f) - softmin) / softrange;
4350 data->drag_map_soft_min = softmin;
4351 data->drag_map_soft_max = softmax;
4354 data->dragchange =
false;
4355 data->draglock =
true;
4374 data->dragstartx = 0;
4375 data->draglastx = 0;
4376 data->dragchange =
false;
4377 data->dragcbd =
nullptr;
4383 if (
data->interactive) {
4426 PanelType *popover_panel_type =
nullptr;
4427 void *arg =
nullptr;
4432 status.
item(
" ", ICON_NONE);
4435 switch (but->
type) {
4451 const char *idname =
static_cast<const char *
>(but->
func_argN);
4462 popover_panel_type =
reinterpret_cast<PanelType *
>(but->
poin);
4471 const char *idname =
static_cast<const char *
>(but->
func_argN);
4485 if (func || handlefunc) {
4487 C,
data->region, but, func, handlefunc, arg,
nullptr,
false);
4492 else if (menufunc) {
4501 else if (popoverfunc) {
4511 data->select_others.is_enabled =
true;
4539 data->menu =
nullptr;
4548 return data->menu->direction;
4569 data->cancel =
true;
4594 int x =
event->xy[0],
y =
event->xy[1];
4603 xmax -= 0.2 * icon_size;
4612 if ((
x > (xmax - icon_size)) &&
x <= xmax) {
4655 if (op_icon->highlighted) {
4656 old_highlighted = op_icon;
4667 if (old_highlighted != hovered) {
4672#ifdef USE_DRAG_TOGGLE
4681 data->dragstartx =
event->xy[0];
4682 data->dragstarty =
event->xy[1];
4690 data->applied =
false;
4700#ifdef USE_DRAG_TOGGLE
4717 data->cancel =
true;
4730 data->cancel =
true;
4774 data->cancel =
true;
4776 data->escapecancel =
true;
4794 data->cancel =
true;
4802 data->cancel =
true;
4803 data->escapecancel =
true;
4834 data->cancel =
true;
4847 const bool is_property = (but->
rnaprop !=
nullptr);
4849#ifdef USE_DRAG_TOGGLE
4870 if (event->
val == event_val) {
4895 const int inc_value)
4909 bool no_zero_strip =
false;
4910 if (str_maxncpy != 0) {
4919 if (but_string[0] ==
'\0') {
4934 if (
num == 0 && digits == 0) {
4981 const int inc_value = (
event->type ==
WHEELUPMOUSE) ? 1 : -1;
5010#ifdef USE_DRAG_TOGGLE
5020 bool do_activate =
false;
5057 int type =
event->type;
5058 int val =
event->val;
5077 data->cancel =
true;
5113 const bool close_popup =
true)
5139 switch (event->
val) {
5148 data->dragstartx =
event->xy[0];
5149 data->dragstarty =
event->xy[1];
5161 data->cancel =
true;
5189 data->dragstartx =
event->xy[0];
5190 data->dragstarty =
event->xy[1];
5194#ifdef USE_DRAG_TOGGLE
5197 data->dragstartx =
event->xy[0];
5198 data->dragstarty =
event->xy[1];
5255 if (tempf == softmin || tempf == softmax ||
snap ==
SNAP_OFF) {
5260 float softrange = softmax - softmin;
5286 if (softrange >= 21.0f) {
5298 switch (scale_type) {
5302 if (softrange < 2.10f) {
5303 tempf = roundf(tempf * 10.0f / snap_fac) * 0.1f * snap_fac;
5305 else if (softrange < 21.0f) {
5306 tempf = roundf(tempf / snap_fac) * snap_fac;
5309 tempf = roundf(tempf * 0.1f / snap_fac) * 10.0f * snap_fac;
5314 const float snap_fac =
powf(10.0f,
5317 tempf = roundf(tempf / snap_fac) * snap_fac;
5335 if (
ELEM(temp, softmin, softmax)) {
5343 temp = 10 * (temp / 10);
5346 temp = 100 * (temp / 100);
5357 const bool is_motion,
5363 bool changed =
false;
5368 if ((is_motion ||
data->draglock) &&
5378 const float softmin = but->
softmin;
5379 const float softmax = but->
softmax;
5380 const float softrange = softmax - softmin;
5391 switch (scale_type) {
5393 tempf = float(
data->startvalue) + float(mx -
data->dragstartx) * fac;
5397 const float startvalue =
max_ff(
float(
data->startvalue), log_min);
5398 tempf =
expf(
float(mx -
data->dragstartx) * fac) * startvalue;
5399 if (tempf <= log_min) {
5405 tempf = cbrtf(
float(
data->startvalue)) + float(mx -
data->dragstartx) * fac;
5406 tempf *= tempf * tempf;
5414 switch (scale_type) {
5416 if (tempf < softmin) {
5417 data->dragstartx -= (softmin - tempf) / fac;
5420 else if (tempf > softmax) {
5421 data->dragstartx -= (softmax - tempf) / fac;
5427 const float startvalue =
max_ff(
float(
data->startvalue), log_min);
5428 if (tempf < log_min) {
5429 data->dragstartx -=
logf(log_min / startvalue) / fac - float(mx -
data->dragstartx);
5432 else if (tempf > softmax) {
5433 data->dragstartx -=
logf(softmax / startvalue) / fac - float(mx -
data->dragstartx);
5439 if (tempf < softmin) {
5440 data->dragstartx = mx - int((cbrtf(softmin) - cbrtf(
float(
data->startvalue))) / fac);
5443 else if (tempf > softmax) {
5444 data->dragstartx = mx - int((cbrtf(softmax) - cbrtf(
float(
data->startvalue))) / fac);
5451 CLAMP(tempf, softmin, softmax);
5454 if (tempf !=
float(
data->value)) {
5455 data->dragchange =
true;
5456 data->value = tempf;
5461 if (softrange > 256) {
5464 else if (softrange > 32) {
5471 temp =
data->startvalue + ((double(mx) -
data->dragstartx) * double(fac));
5475 if (temp < softmin) {
5476 data->dragstartx -= (softmin - temp) / fac;
5479 else if (temp > softmax) {
5480 data->dragstartx += (temp - softmax) / fac;
5484 CLAMP(temp, softmin, softmax);
5487 if (temp !=
data->value) {
5488 data->dragchange =
true;
5494 data->draglastx = mx;
5498 const float softmin =
data->drag_map_soft_min;
5499 const float softmax =
data->drag_map_soft_max;
5500 const float softrange = softmax - softmin;
5502 float non_linear_range_limit;
5503 float non_linear_pixel_map;
5504 float non_linear_scale;
5511 non_linear_range_limit = 11.0f;
5512 non_linear_pixel_map = 500.0f;
5516 non_linear_range_limit = 129.0f;
5518 non_linear_pixel_map = 250.0f;
5521 if (softrange > 600) {
5522 deler =
powf(softrange, 0.75f);
5524 else if (softrange < 25) {
5527 else if (softrange < 100) {
5533 if (softrange > non_linear_range_limit) {
5534 non_linear_scale = float(
abs(mx -
data->dragstartx)) / non_linear_pixel_map;
5537 non_linear_scale = 1.0f;
5540 if (is_float ==
false) {
5545 data->dragf += (float(mx -
data->draglastx) / deler) * non_linear_scale;
5547 if (but->
softmin == softmin) {
5550 if (but->
softmax == softmax) {
5554 data->draglastx = mx;
5556 switch (scale_type) {
5558 tempf = (softmin +
data->dragf * softrange);
5564 const float base = softmax / log_min;
5565 tempf =
powf(base,
data->dragf) * log_min;
5566 if (tempf <= log_min) {
5572 tempf = (softmin +
data->dragf * softrange);
5573 tempf *= tempf * tempf;
5574 float cubic_min = softmin * softmin * softmin;
5575 float cubic_max = softmax * softmax * softmax;
5576 tempf = (tempf - cubic_min) / (cubic_max - cubic_min) * softrange + softmin;
5587 lvalue = int(
data->value);
5589 if (temp != lvalue) {
5590 data->dragchange =
true;
5591 data->value = double(temp);
5601 if (tempf !=
float(
data->value)) {
5602 data->dragchange =
true;
5603 data->value = tempf;
5623 if (
data->dragchange ==
false) {
5628 int mx =
data->window->eventstate->xy[0];
5629 int my =
data->window->eventstate->xy[1];
5632 if (mx < (but->
rect.
xmin + handle_width)) {
5635 else if (mx > (but->
rect.
xmax - handle_width)) {
5643 if (
data->changed_cursor) {
5645 data->changed_cursor =
false;
5649 if (
data->changed_cursor ==
false) {
5651 data->changed_cursor =
true;
5669 int mx =
event->xy[0];
5670 int my =
event->xy[1];
5672 const int screen_mx =
event->xy[0];
5683 int type =
event->type, val =
event->val;
5731#ifdef USE_DRAG_MULTINUM
5739 data->cancel =
true;
5740 data->escapecancel =
true;
5745 if (
data->dragchange) {
5746#ifdef USE_DRAG_MULTINUM
5762 const bool is_motion = (
event->type ==
MOUSEMOVE);
5766#ifdef USE_DRAG_MULTINUM
5767 data->multi_data.drag_dir[0] +=
abs(
data->draglastx - mx);
5768 data->multi_data.drag_dir[1] +=
abs(
data->draglasty - my);
5786#ifdef USE_DRAG_MULTINUM
5787 else if (
data->multi_data.has_mbuts) {
5814 const int value_step = int(number_but->
step_size);
5819 double(
max_ii(softmin,
int(
data->value) - value_step)) :
5820 double(
min_ii(softmax,
int(
data->value) + value_step));
5821 if (value_test !=
data->value) {
5822 data->value = double(value_test);
5825 data->cancel =
true;
5845 if (
UNLIKELY(!isfinite(precision))) {
5854 const double value_test =
5858 if (value_test !=
data->value) {
5859 data->value = value_test;
5862 data->cancel =
true;
5874 data->draglastx = mx;
5875 data->draglasty = my;
5884 const bool is_horizontal,
5885 const bool is_motion,
5890 float cursor_x_range, f, tempf, softmin, softmax, softrange;
5892 bool changed =
false;
5909 softrange = softmax - softmin;
5928 f = (mx_fl -
data->dragstartx) / cursor_x_range +
data->dragfstart;
5929 CLAMP(f, 0.0f, 1.0f);
5932#ifdef USE_CONT_MOUSE_CORRECT
5935 if (is_horizontal) {
5936 data->ungrab_mval[0] = but->
rect.
xmin + (f * cursor_x_range);
5940 data->ungrab_mval[1] = but->
rect.
ymin + (f * cursor_x_range);
5948 switch (scale_type) {
5950 tempf = softmin + f * softrange;
5954 tempf =
powf(softmax / softmin, f) * softmin;
5958 const float cubicmin =
cube_f(softmin);
5959 const float cubicmax =
cube_f(softmax);
5960 const float cubicrange = cubicmax - cubicmin;
5961 tempf =
cube_f(softmin + f * softrange);
5962 tempf = (tempf - cubicmin) / cubicrange * softrange + softmin;
5969 if (
ELEM(tempf, softmin, softmax)) {
5975 if (
ELEM(tempf, softmin, softmax)) {
5977 else if (softrange < 2.10f) {
5978 tempf = roundf(tempf * 100.0f) * 0.01f;
5980 else if (softrange < 21.0f) {
5981 tempf = roundf(tempf * 10.0f) * 0.1f;
5984 tempf = roundf(tempf);
5988 if (softrange < 2.10f) {
5989 tempf = roundf(tempf * 10.0f) * 0.1f;
5991 else if (softrange < 21.0f) {
5992 tempf = roundf(tempf);
5995 tempf = roundf(tempf * 0.1f) * 10.0f;
6000 temp = 10 * (temp / 10);
6008 CLAMP(temp, softmin, softmax);
6010 if (temp != lvalue) {
6012 data->dragchange =
true;
6017 CLAMP(tempf, softmin, softmax);
6019 if (tempf !=
float(
data->value)) {
6020 data->value = tempf;
6021 data->dragchange =
true;
6035 int mx =
event->xy[0];
6036 int my =
event->xy[1];
6043 int type =
event->type, val =
event->val;
6067#ifndef USE_ALLSELECT
6082 data->dragstartx = mx;
6083 data->draglastx = mx;
6097#ifdef USE_DRAG_MULTINUM
6104 data->cancel =
true;
6105 data->escapecancel =
true;
6110 if (
data->dragchange) {
6111#ifdef USE_DRAG_MULTINUM
6123#ifdef USE_CONT_MOUSE_CORRECT
6131 const bool is_motion = (
event->type ==
MOUSEMOVE);
6132#ifdef USE_DRAG_MULTINUM
6133 data->multi_data.drag_dir[0] +=
abs(
data->draglastx - mx);
6134 data->multi_data.drag_dir[1] +=
abs(
data->draglasty - my);
6148#ifdef USE_DRAG_MULTINUM
6149 else if (
data->multi_data.has_mbuts) {
6172 float f, tempf, softmin, softmax, softrange;
6179 softrange = softmax - softmin;
6181 tempf =
data->value;
6182 temp = int(
data->value);
6185 if (but->
type == SLI) {
6196 f =
powf(softmax / softmin, f) * softmin;
6199 f = softmin + f * softrange;
6211 if (temp >= softmin && temp <= softmax) {
6215 data->cancel =
true;
6219 if (tempf >= softmin && tempf <= softmax) {
6229 tempf -= value_step;
6232 tempf += value_step;
6235 CLAMP(tempf, softmin, softmax);
6236 data->value = tempf;
6239 data->cancel =
true;
6253 data->draglastx = mx;
6254 data->draglasty = my;
6265 int mx =
event->xy[0];
6266 int my =
event->xy[1];
6276 data->dragstartx = mx;
6277 data->draglastx = mx;
6280 data->dragstartx = my;
6281 data->draglastx = my;
6291 data->cancel =
true;
6292 data->escapecancel =
true;
6300 const bool is_motion =
true;
6303 (horizontal) ? mx : my,
6336 int mx =
event->xy[0];
6337 int my =
event->xy[1];
6343 data->dragstartx =
event->xy[0];
6344 data->dragstarty =
event->xy[1];
6353 data->cancel =
true;
6354 data->escapecancel =
true;
6362 int dragstartx =
data->dragstartx;
6363 int dragstarty =
data->dragstarty;
6365 data->value =
data->origvalue + (horizontal ? mx - dragstartx : dragstarty - my);
6408 data->dragstartx =
event->xy[0];
6409 data->dragstarty =
event->xy[1];
6413#ifdef USE_DRAG_TOGGLE
6416 data->dragstartx =
event->xy[0];
6417 data->dragstarty =
event->xy[1];
6429 int type =
event->type;
6430 int val =
event->val;
6456 data->postbut = but;
6483 data->cancel =
true;
6500 bool changed =
true;
6508 float *fp =
data->origvec;
6510 const float radsq = rad * rad;
6514 mdx = (rad * fp[0]);
6515 mdy = (rad * fp[1]);
6517 else if (fp[2] > -1.0f) {
6518 mrad = rad /
sqrtf(fp[0] * fp[0] + fp[1] * fp[1]);
6520 mdx = 2.0f * mrad * fp[0] - (rad * fp[0]);
6521 mdy = 2.0f * mrad * fp[1] - (rad * fp[1]);
6527 float dx = float(mx + mdx -
data->dragstartx);
6528 float dy = float(my + mdy -
data->dragstarty);
6531 mrad = dx * dx + dy * dy;
6535 fp[2] =
sqrtf(radsq - dx * dx - dy * dy);
6539 mrad = rad /
sqrtf(mrad);
6541 dx *= (2.0f * mrad - 1.0f);
6542 dy *= (2.0f * mrad - 1.0f);
6544 mrad = dx * dx + dy * dy;
6548 fp[2] = -
sqrtf(radsq - dx * dx - dy * dy);
6554 const int snap_steps = (
snap ==
SNAP_ON) ? 4 : 12;
6555 const float snap_steps_angle =
M_PI / snap_steps;
6556 float angle, angle_snap;
6560 for (
int i = 0;
i < 3;
i++) {
6562 angle_snap = roundf(
angle / snap_steps_angle) * snap_steps_angle;
6563 fp[
i] =
sinf(angle_snap);
6569 data->draglastx = mx;
6570 data->draglasty = my;
6595 data->dragstartx =
event->xy[0];
6596 data->dragstarty =
event->xy[1];
6600#ifdef USE_DRAG_TOGGLE
6604 data->dragstartx =
event->xy[0];
6605 data->dragstarty =
event->xy[1];
6617 float hsv_static[3] = {0.0f};
6625 hsv[2] =
clamp_f(hsv[2] - 0.05f, 0.0f, 1.0f);
6628 hsv[2] =
clamp_f(hsv[2] + 0.05f, 0.0f, 1.0f);
6631 const float fac = 0.005 * (
event->xy[1] -
event->prev_xy[1]);
6632 hsv[2] =
clamp_f(hsv[2] + fac, 0.0f, 1.0f);
6668 data->cancel =
true;
6677 if (paint !=
nullptr) {
6680 if (brush ==
nullptr) {
6697 bool updated =
false;
6742 int mx =
event->xy[0];
6743 int my =
event->xy[1];
6749 data->dragstartx = mx;
6750 data->dragstarty = my;
6751 data->draglastx = mx;
6752 data->draglasty = my;
6774 data->cancel =
true;
6775 data->escapecancel =
true;
6793 const float v_max =
max_fff(
v[0],
v[1],
v[2]);
6796 v[0] = std::min(
v[0],
max);
6797 v[1] = std::min(
v[1],
max);
6798 v[2] = std::min(
v[2],
max);
6851 const bool changed =
true;
6855#ifdef USE_CONT_MOUSE_CORRECT
6858 data->ungrab_mval[0] = mx_fl;
6859 data->ungrab_mval[1] = my_fl;
6872 float xpos, ypos, hsvo[3];
6887 mx_fl = xpos - (
data->dragstartx - mx_fl);
6888 my_fl = ypos - (
data->dragstarty - my_fl);
6950 data->draglastx = mx;
6951 data->draglasty = my;
6956#ifdef WITH_INPUT_NDOF
6957static void ui_ndofedit_but_HSVCUBE(
uiButHSVCube *hsv_but,
6959 const wmNDOFMotionData *ndof,
6967 const float sensitivity = (shift ? 0.15f : 0.3f) * ndof->dt;
6973 switch (hsv_but->gradient_type) {
6975 hsv[1] += ndof->rvec[2] * sensitivity;
6976 hsv[2] += ndof->rvec[0] * sensitivity;
6979 hsv[0] += ndof->rvec[2] * sensitivity;
6980 hsv[2] += ndof->rvec[0] * sensitivity;
6983 hsv[0] += ndof->rvec[2] * sensitivity;
6984 hsv[1] += ndof->rvec[0] * sensitivity;
6987 hsv[0] += ndof->rvec[2] * sensitivity;
6990 hsv[1] += ndof->rvec[2] * sensitivity;
6993 hsv[2] += ndof->rvec[2] * sensitivity;
7000 hsv[2] += ndof->rvec[0] * sensitivity;
7002 CLAMP(hsv[2], hsv_but->softmin, hsv_but->softmax);
7030 int mx =
event->xy[0];
7031 int my =
event->xy[1];
7038 data->dragstartx = mx;
7039 data->dragstarty = my;
7040 data->draglastx = mx;
7041 data->draglasty = my;
7051#ifdef WITH_INPUT_NDOF
7053 const wmNDOFMotionData *ndof =
static_cast<const wmNDOFMotionData *
>(
event->customdata);
7073 float rgb[3], def_hsv[3];
7084 def_hsv[0] = hsv[0];
7085 def_hsv[1] = hsv[1];
7100 data->cancel =
true;
7101 data->escapecancel =
true;
7131 const bool changed =
true;
7138#ifdef USE_CONT_MOUSE_CORRECT
7141 data->ungrab_mval[0] = mx_fl;
7142 data->ungrab_mval[1] = my_fl;
7166 if (hsv[2] == 0.0f) {
7171 if (hsv[2] == 0.0f) {
7174 hsv[2] = std::min(hsv[2], 0.9999f);
7180 float xpos, ypos, hsvo[3], rgbo[3];
7191 mx_fl = xpos - (
data->dragstartx - mx_fl);
7192 my_fl = ypos - (
data->dragstarty - my_fl);
7198 hsv[1] = 1.0f -
sqrt3f(1.0f - hsv[1]);
7216 data->draglastx = mx;
7217 data->draglasty = my;
7222#ifdef WITH_INPUT_NDOF
7223static void ui_ndofedit_but_HSVCIRCLE(
uiBut *but,
7225 const wmNDOFMotionData *ndof,
7233 const float sensitivity = (shift ? 0.06f : 0.3f) * ndof->dt;
7240 phi =
fmodf(hsv[0] + 0.25f, 1.0f) * -2.0f * float(
M_PI);
7245 v[0] = r *
cosf(phi);
7246 v[1] = r *
sinf(phi);
7249 v[0] += ndof->rvec[2] * sensitivity;
7250 v[1] += ndof->rvec[0] * sensitivity;
7256 phi += ndof->rvec[1] * sensitivity * 0.5f;
7265 if (cpicker->use_color_lock) {
7267 if (hsv[2] == 0.0f) {
7272 if (hsv[2] == 0.0f) {
7275 if (hsv[2] == 1.0f) {
7289 if (cpicker->use_luminosity_lock) {
7305 int mx =
event->xy[0];
7306 int my =
event->xy[1];
7312 data->dragstartx = mx;
7313 data->dragstarty = my;
7314 data->draglastx = mx;
7315 data->draglasty = my;
7325#ifdef WITH_INPUT_NDOF
7328 const wmNDOFMotionData *ndof =
static_cast<const wmNDOFMotionData *
>(
event->customdata);
7346 float rgb[3], def_hsv[3];
7355 def_hsv[0] = hsv[0];
7356 def_hsv[2] = hsv[2];
7372 data->cancel =
true;
7373 data->escapecancel =
true;
7379 hsv[2] =
clamp_f(hsv[2] - 0.05f, 0.0f, 1.0f);
7384 hsv[2] =
clamp_f(hsv[2] + 0.05f, 0.0f, 1.0f);
7408 bool changed =
false;
7410 if (
data->draglastx == mx) {
7414 if (
data->coba->tot == 0) {
7419 data->dragcbd->pos += dx;
7425 data->draglastx = mx;
7434 int mx =
event->xy[0];
7435 int my =
event->xy[1];
7453 data->dragstartx = mx;
7454 data->dragstarty = my;
7455 data->draglastx = mx;
7456 data->draglasty = my;
7460 for (a = 0, cbd = coba->
data; a < coba->tot; a++, cbd++) {
7462 xco =
abs(xco - mx);
7463 if (a == coba->
cur) {
7467 if (xco < mindist) {
7474 data->dragfstart =
data->dragcbd->pos;
7483 if (mx !=
data->draglastx || my !=
data->draglasty) {
7494 data->dragcbd->pos =
data->dragfstart;
7496 data->cancel =
true;
7497 data->escapecancel =
true;
7518 bool changed =
false;
7525 int dragx =
data->draglastx;
7526 int dragy =
data->draglasty;
7535 d[0] = mx -
data->dragstartx;
7536 d[1] = my -
data->dragstarty;
7543 float fx = (mx - dragx) / zoomx;
7544 float fy = (my - dragy) / zoomy;
7546 if (
data->dragsel != -1) {
7549 bool moved_point =
false;
7554 for (
int a = 0; a < cuma->
totpoint; a++) {
7556 const float origx = cmp[a].
x, origy = cmp[a].
y;
7560 cmp[a].
x = 0.125f * roundf(8.0f * cmp[a].
x);
7561 cmp[a].
y = 0.125f * roundf(8.0f * cmp[a].
y);
7563 if (cmp[a].
x != origx || cmp[a].
y != origy) {
7574 data->draglastx = evtx;
7575 data->draglasty = evty;
7578#ifdef USE_CONT_MOUSE_CORRECT
7590 data->dragchange =
true;
7595 if (cumap->
curr.
xmin - fx < cumap->clipr.xmin) {
7601 if (cumap->
curr.
ymin - fy < cumap->clipr.ymin) {
7614 data->draglastx = evtx;
7615 data->draglasty = evty;
7626 bool changed =
false;
7630 int mx =
event->xy[0];
7631 int my =
event->xy[1];
7638 const float m_xy[2] = {float(mx), float(my)};
7653 for (
int a = 0; a < cuma->
totpoint; a++) {
7657 if (dist_sq < dist_min_sq) {
7659 dist_min_sq = dist_sq;
7664 float f_xy[2], f_xy_prev[2];
7693 for (
int a = 0; a < cuma->
totpoint; a++) {
7694 if (cmp[a].
x == f_xy[0]) {
7707 for (
int a = 0; a < cuma->
totpoint; a++) {
7718 data->cancel =
true;
7721 data->dragsel = sel;
7723 data->dragstartx =
event->xy[0];
7724 data->dragstarty =
event->xy[1];
7725 data->draglastx =
event->xy[0];
7726 data->draglasty =
event->xy[1];
7734 if (event->
xy[0] !=
data->draglastx || event->
xy[1] !=
data->draglasty) {
7749 if (
data->dragsel != -1) {
7754 if (
data->dragchange ==
false) {
7757 for (
int a = 0; a < cuma->
totpoint; a++) {
7792 bool changed =
false;
7799 int dragx =
data->draglastx;
7800 int dragy =
data->draglasty;
7807 const float d[2] = {float(mx -
data->dragstartx), float(
data->dragstarty)};
7813 float fx = (mx - dragx) / zoomx;
7814 float fy = (my - dragy) / zoomy;
7816 if (
data->dragsel != -1) {
7817 float last_x, last_y;
7819 bool moved_point =
false;
7825 const float delta[2] = {fx, fy};
7826 for (
int a = 0; a < profile->
path_len; a++) {
7837 last_x = pts[a].
h1_loc[0];
7838 last_y = pts[a].
h1_loc[1];
7842 last_x = pts[a].
h2_loc[0];
7843 last_y = pts[a].
h2_loc[1];
7851 data->draglastx = evtx;
7852 data->draglasty = evty;
7854#ifdef USE_CONT_MOUSE_CORRECT
7865 data->dragchange =
true;
7870 if (profile->
view_rect.
xmin - fx < profile->clip_rect.xmin) {
7876 if (profile->
view_rect.
ymin - fy < profile->clip_rect.ymin) {
7889 data->draglastx = evtx;
7890 data->draglasty = evty;
7916 int mx =
event->xy[0];
7917 int my =
event->xy[1];
7923 data->dragstartx = mx;
7924 data->dragstarty = my;
7925 data->draglastx = mx;
7926 data->draglasty = my;
7942 const float m_xy[2] = {float(mx), float(my)};
7956 int i_selected = -1;
7957 short selection_type = 0;
7962 if (dist_sq < dist_min_sq) {
7965 dist_min_sq = dist_sq;
7973 if (dist_sq < dist_min_sq) {
7976 dist_min_sq = dist_sq;
7982 if (dist_sq < dist_min_sq) {
7985 dist_min_sq = dist_sq;
7992 if (i_selected == -1) {
7993 float f_xy[2], f_xy_prev[2];
8011 i_selected = int(new_pt - profile->
path);
8012 BLI_assert(i_selected >= 0 && i_selected <= profile->path_len);
8020 if (i_selected != -1) {
8023 pts[i_selected].
flag ^= selection_type;
8030 profile->
path[i_selected].
flag |= selection_type;
8035 data->cancel =
true;
8038 data->dragsel = i_selected;
8040 data->dragstartx = mx;
8041 data->dragstarty = my;
8042 data->draglastx = mx;
8043 data->draglasty = my;
8051 if (mx !=
data->draglastx || my !=
data->draglasty) {
8061 if (
data->dragsel != -1) {
8063 if (
data->dragchange ==
false) {
8082 const bool changed =
true;
8083 const float dy = my -
data->draglasty;
8087 hist->
ymax += (dy * 0.1f) * yfac;
8092 data->draglastx = mx;
8093 data->draglasty = my;
8101 int mx =
event->xy[0];
8102 int my =
event->xy[1];
8107 data->dragstartx = mx;
8108 data->dragstarty = my;
8109 data->draglastx = mx;
8110 data->draglasty = my;
8132 data->cancel =
true;
8133 data->escapecancel =
true;
8138 if (mx !=
data->draglastx || my !=
data->draglasty) {
8156 const bool changed =
true;
8158 const float dy = my -
data->draglasty;
8165 data->draglastx = mx;
8166 data->draglasty = my;
8174 int mx =
event->xy[0];
8175 int my =
event->xy[1];
8180 data->dragstartx = mx;
8181 data->dragstarty = my;
8182 data->draglastx = mx;
8183 data->draglasty = my;
8205 data->cancel =
true;
8206 data->escapecancel =
true;
8211 if (mx !=
data->draglastx || my !=
data->draglasty) {
8230 const bool changed =
true;
8232 float dx = mx -
data->draglastx;
8233 float dy = my -
data->draglasty;
8256 data->draglastx = mx;
8257 data->draglasty = my;
8265 int mx =
event->xy[0];
8266 int my =
event->xy[1];
8271 data->dragstartx = mx;
8272 data->dragstarty = my;
8273 data->draglastx = mx;
8274 data->draglasty = my;
8288 data->cancel =
true;
8289 data->escapecancel =
true;
8294 if (mx !=
data->draglastx || my !=
data->draglasty) {
8325 bool is_press_ctrl_but_no_shift = (
event->val ==
KM_PRESS) &&
8328 const bool do_copy =
event->type ==
EVT_CKEY && is_press_ctrl_but_no_shift;
8329 const bool do_paste =
event->type ==
EVT_VKEY && is_press_ctrl_but_no_shift;
8357 if (clicked_view_item_but) {
8372#ifdef WITH_INPUT_NDOF
8410 switch (but->
type) {
8524#ifdef USE_DRAG_MULTINUM
8542 const float dir_nor_y[2] = {0.0, 1.0f};
8543 float dir_nor_drag[2];
8549 data->multi_data.drag_lock_x =
event->xy[0];
8560 if ((
data->text_edit.edit_string &&
8562 ((
abs(
data->multi_data.drag_lock_x - event->
xy[0]) > margin_x) &&
8566 if (
data->multi_data.has_mbuts) {
8603 block->tooltipdisabled = !enable;
8622 if (
data->autoopentimer) {
8624 data->autoopentimer =
nullptr;
8634 bContext *
C,
ARegion *region,
int *pass,
double *r_pass_delay,
bool *r_exit_on_event)
8636 bool is_quick_tip =
false;
8638 is_quick_tip =
true;
8644 *r_exit_on_event =
false;
8717 if (
data->used_mouse && !
data->autoopentimer) {
8726 time = 5 *
U.menuthreshold2;
8729 time = 5 *
U.menuthreshold1;
8772 status.
item(
IFACE_(
"Cancel"), ICON_EVENT_ESC);
8773#if defined(__APPLE__)
8774 status.
item(
IFACE_(
"Snap"), ICON_KEY_COMMAND);
8776 status.
item(
IFACE_(
"Snap"), ICON_EVENT_CTRL);
8778 status.
item(
IFACE_(
"Precision"), ICON_EVENT_SHIFT);
8795 "Can't edit driven number value, see driver editor for the driver setup");
8801#ifdef USE_CONT_MOUSE_CORRECT
8804 int mouse_ungrab_xy[2];
8807 mouse_ungrab_xy[0] =
data->ungrab_mval[0];
8808 mouse_ungrab_xy[1] =
data->ungrab_mval[1];
8832 else if (
data->flashtimer) {
8834 data->flashtimer =
nullptr;
8842 else if (
data->hold_action_timer) {
8844 data->hold_action_timer =
nullptr;
8853 &
data->window->modalhandlers,
8919 data->region = region;
8921#ifdef USE_CONT_MOUSE_CORRECT
8930 data->interactive =
true;
8951 data->used_mouse =
true;
8959 if (
data->menu &&
data->menu->region) {
9020#ifdef USE_DRAG_MULTINUM
9021 if (
data->multi_data.has_mbuts) {
9022 for (
const std::unique_ptr<uiBut> &bt : block->
buttons) {
9026 if (!
data->cancel) {
9040 if (!
data->cancel ||
data->escapecancel) {
9049 if (!onfree && !
data->cancel) {
9057 uiBut but_temp = *but;
9071 if (
U.runtime.is_dirty ==
false) {
9078 for (
const std::unique_ptr<uiBut> &bt : block_iter->buttons) {
9088 if (
data->text_edit.edit_string) {
9091 if (
data->text_edit.original_string) {
9099 if (
data->changed_cursor) {
9108 if (
data->custom_interaction_handle !=
nullptr) {
9111 data->custom_interaction_handle->user_count--;
9114 if (
data->custom_interaction_handle->user_count == 0) {
9118 data->custom_interaction_handle =
nullptr;
9148 data->cancel =
true;
9162 [&]() { ui_but_active_free(C, but); });
9168 uiBut *but_found =
nullptr;
9176 uiBut *active_but_override =
nullptr;
9177 uiBut *active_but_real =
nullptr;
9178 uiBut *active_but_last =
nullptr;
9182 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
9184 active_but_override = but.get();
9187 active_but_real = but.get();
9190 active_but_last = but.get();
9195 uiBut *activebut = active_but_override;
9197 activebut = active_but_real;
9200 activebut = active_but_last;
9203 if (activebut && (but_check_cb ==
nullptr || but_check_cb(activebut))) {
9206 but_found = activebut;
9209 if (
data &&
data->menu && (region !=
data->menu->region)) {
9210 region =
data->menu->region;
9279 region_popup ? region_popup :
CTX_wm_region(
C), r_ptr, r_prop, r_index);
9297 if (activebut->
func) {
9321 if (region_ctx ==
nullptr) {
9327 if (block->ui_operator) {
9328 return block->ui_operator;
9337 if (region == region_ctx) {
9341 if (block->ui_operator) {
9342 return block->ui_operator;
9367 uiBut *activebut =
nullptr;
9370 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
9380 activebut = but.get();
9383 activebut = but.get();
9392 region =
data->menu->region;
9408 if (!active_but || !active_but->
active || !active_but->
changed || active_but->
block != block) {
9414 if (
data->searchbox) {
9430 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
9442 const bool labeledit =
event->modifier &
KM_CTRL;
9446 const bool for_tooltip =
true;
9448 region, event->
xy, labeledit, for_tooltip,
nullptr,
nullptr);
9485 event.customdata = but;
9486 event.customdata_free =
false;
9503 *active_back = but->
active;
9504 data = MEM_new<uiHandleButtonData>(__func__);
9507 data->region = region;
9530 data->cancel =
true;
9556 printf(
"%s: error, unhandled type: %d\n", __func__, but->
type);
9582 if (prev_active_but) {
9583 prev_active_but->
active =
nullptr;
9599 if (prev_active_but) {
9600 prev_active_but->
active = prev_active_data;
9617 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
9636 double default_value;
9640 default_value = double(
9649 default_value = double(
9657 *r_value = default_value;
9675 switch (event->
type) {
9678 data->cancel =
true;
9681#ifdef USE_UI_POPOVER_ONCE
9687 data->cancel =
false;
9722 data->cancel =
true;
9727 bool reenable_tooltip =
true;
9733 reenable_tooltip = (movement > threshold);
9735 if (reenable_tooltip) {
9750 data->autoopentimer =
nullptr;
9775 switch (event->
type) {
9777 data->cancel =
true;
9784 data->cancel =
true;
9792 data->hold_action_timer =
nullptr;
9805 if (
data->hold_action_timer) {
9809 if (movement <= threshold) {
9821 data->cancel =
false;
9828 data->cancel =
true;
9843 switch (event->
type) {
9859 switch (event->
type) {
9863 if (
data->menu &&
data->menu->region) {
9873 data->cancel =
true;
9908 if ((
data->cancel ==
false) && (
data->text_edit.edit_string !=
nullptr) &&
9909 (
data->text_edit.edit_string[0] ==
'\0') &&
9915#ifdef USE_DRAG_MULTINUM
9916 if (
data->multi_data.mbuts) {
9920 double default_value;
9927 data->multi_data.skip =
true;
9970 bool activate_dragging)
9994 if (activate_dragging && do_drag) {
9995 ((
uiList *)ui_list)->dyn_data->custom_activate_optype =
nullptr;
10002 ((
uiList *)ui_list)->dyn_data->custom_activate_optype = custom_activate_optype;
10018 region, mouse_xy,
false,
false,
nullptr,
nullptr);
10042 bool activate_dragging =
false;
10045 if (is_draggable) {
10046 activate_dragging =
true;
10069 if (new_active_row) {
10112 int type =
event->type, val =
event->val;
10113 int scroll_dir = 1;
10114 bool redraw =
false;
10117 if (!ui_list || !ui_list->
dyn_data) {
10122 int mx =
event->xy[0];
10123 int my =
event->xy[1];
10153 value = value_orig;
10162 int current_idx = -1;
10164 for (
int i = 0;
i <
len;
i++) {
10166 org_order[new_order ? new_order[++org_idx] : ++org_idx] =
i;
10168 current_idx = new_order ? new_order[org_idx] : org_idx;
10171 else if (
i == value && org_idx >= 0) {
10172 current_idx = -(new_order ? new_order[org_idx] : org_idx) - 1;
10179 if (current_idx < 0) {
10180 current_idx = (current_idx * -1) + (inc < 0 ? inc : inc - 1);
10183 current_idx += inc;
10186 value = org_order[current_idx];
10198 if (value != value_orig) {
10239 const bool has_view = [&]() {
10248 if (!has_view && !has_list) {
10254 uiBut *highlight_row_but = [&]() ->
uiBut * {
10267 bool changed =
false;
10269 if (highlight_row_but && !(highlight_row_but->
flag &
UI_HOVER)) {
10275 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
10276 if (but.get() == highlight_row_but) {
10302 switch (event->
type) {
10319 const bool close_popup = view_but == active_but;
10358 if (
data->interactive) {
10371 data->cancel =
true;
10387 data->cancel =
true;
10444 const bool use_wiggle_room)
10459 }
while ((region = region->
next));
10468 const float newp[2] = {float(
xy[0]), float(
xy[1])};
10481 const float p1[2] = {rect_px.
xmin - margin, rect_px.
ymin - margin};
10482 const float p2[2] = {rect_px.
xmax + margin, rect_px.
ymin - margin};
10483 const float p3[2] = {rect_px.
xmax + margin, rect_px.
ymax + margin};
10484 const float p4[2] = {rect_px.
xmin - margin, rect_px.
ymax + margin};
10488 if (use_wiggle_room) {
10513#ifdef USE_KEYNAV_LIMIT
10567 for (
const std::unique_ptr<uiBut> &bt : block->
buttons) {
10568 ymax =
max_ff(ymax, bt->rect.ymax);
10571 dy = block->
rect.
ymax - ymax - scroll_pad;
10577 for (
const std::unique_ptr<uiBut> &bt : block->
buttons) {
10578 ymin =
min_ff(ymin, bt->rect.ymin);
10581 dy = block->
rect.
ymin - ymin + scroll_pad;
10591 for (
const std::unique_ptr<uiBut> &bt : block->
buttons) {
10592 bt->rect.ymin += dy;
10593 bt->rect.ymax += dy;
10631 else if (test ==
'b') {
10644 if (scroll_dir == 1) {
10650 else if (scroll_dir == -1) {
10673 block->auto_open =
false;
10689 const bool is_parent_menu,
10695 if ((level != 0) && (but ==
nullptr) && (is_parent_menu || menu->
popup ==
false)) {
10796 after->
opptr = MEM_new<PointerRNA>(__func__);
10802 if (num_bytes != -1) {
10803 char buf[
sizeof(
event->utf8_buf) + 1];
10804 memcpy(buf, event->
utf8_buf, num_bytes);
10805 buf[num_bytes] =
'\0';
10819 const bool is_parent_inside,
10820 const bool is_parent_menu,
10821 const bool is_floating)
10829 int mx =
event->xy[0];
10830 int my =
event->xy[1];
10836 const bool inside_title = inside && ((my + (
UI_UNIT_Y * 1.4f)) > block->
rect.
ymax);
10841#ifdef USE_DRAG_POPUP
10843# if defined(__APPLE__)
10853 if (!menu->
is_grab && is_floating) {
10864 else if (win->
cursor == PopupTitleHoverCursor) {
10928 switch (event->
type) {
10936 if (inside ==
false) {
10969 menu, but, level, is_parent_menu, retval))
11001 const float dy =
event->xy[1] -
event->prev_xy[1];
11022 const int scroll_dir = (
event->type ==
WHEELUPMOUSE) ? 1 : -1;
11045 int type =
event->type;
11046 int val =
event->val;
11071 menu, but, level, is_parent_menu, retval))
11076#ifdef USE_KEYNAV_LIMIT
11099 uiBut *but_wrap =
nullptr;
11184 menu, but, level, is_parent_menu, retval))
11200 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
11203 if (!
ELEM(but->type,
11213 if (but->rnapoin.data && but->rnaprop &&
11216 if (but->rnaindex == act - 1) {
11220 else if (
ELEM(but->type,
11289 if ((level != 0) && (but ==
nullptr || !menu->
menu_idname[0])) {
11300 menu, but, level, is_parent_menu, retval))
11306 for (
const std::unique_ptr<uiBut> &but_iter : block->
buttons) {
11308 if (
ELEM(but_iter->type,
11340 if ((inside ==
false) && (menu->
menuretval == 0)) {
11355 &saferct->
parent,
float(event->
xy[0]),
float(event->
xy[1])))
11380#ifdef USE_KEYNAV_LIMIT
11395 if ((but_default !=
nullptr) && (but_default->
active ==
nullptr)) {
11409 if (but_active ==
nullptr) {
11414#ifdef USE_DRAG_POPUP
11416 (inside && is_floating && inside_title))
11441 saferct = saferct->
next)
11488#ifdef USE_UI_POPOVER_ONCE
11578 if (!force_close) {
11608 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
11620 if (but ==
nullptr) {
11663 float event_xy[2] = {float(event->
xy[0]), float(event->
xy[1])};
11677 if (duration > 0.01 *
U.pie_initial_timeout) {
11683 const double final_time = 0.01 *
U.pie_animation_timeout;
11684 float fac = duration / final_time;
11692 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
11699 center[0] = (vec[0] > 0.01f) ? 0.5f : ((vec[0] < -0.01f) ? -0.5f : 0.0f);
11700 center[1] = (vec[1] > 0.99f) ? 0.5f : ((vec[1] < -0.99f) ? -0.5f : 0.0f);
11730 if (len_sq < 1.0f) {
11759 if (but && (
U.pie_menu_confirm > 0) &&
11760 (dist >=
UI_SCALE_FAC * (
U.pie_menu_threshold +
U.pie_menu_confirm)))
11773 switch (event->
type) {
11775 if (!is_click_style) {
11785 if ((
U.pie_menu_confirm > 0) &&
11786 (dist >=
UI_SCALE_FAC * (
U.pie_menu_threshold +
U.pie_menu_confirm)))
11801 if (is_click_style) {
11853 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
11854 if (but->menu_key == event->
type) {
11862#define CASE_NUM_TO_DIR(n, d) \
11863 case (EVT_ZEROKEY + n): \
11864 case (EVT_PAD0 + n): { \
11865 if (num_dir == UI_RADIAL_NONE) { \
11891#undef CASE_NUM_TO_DIR
11906 const bool is_parent_inside,
11907 const bool is_parent_menu,
11908 const bool is_floating)
11911 bool do_towards_reinit =
false;
11921 bool inside =
false;
11927 if (do_recursion) {
11928 if (is_parent_inside ==
false) {
11929 int mx =
event->xy[0];
11930 int my =
event->xy[1];
11936 C, event, submenu, level + 1, is_parent_inside || inside, is_menu,
false);
11941 if (block->panel) {
11942 int mx =
event->xy[0];
11943 int my =
event->xy[1];
11945 if (!
IN_RANGE(
float(mx), block->rect.xmin, block->rect.xmax)) {
11985 if (do_but_search) {
11994 do_towards_reinit =
true;
12005 bool handled =
false;
12010 retval = retval_test;
12015 if (handled ==
false) {
12017 C, event, menu, level, is_parent_inside, is_parent_menu, is_floating);
12029 if (do_towards_reinit) {
12113 if (region ==
nullptr) {
12119 if (screen ==
nullptr) {
12135 BLI_assert(active_but->semi_modal_state ==
nullptr);
12172 if (
data->menu &&
data->menu->region &&
12180 if (!but_other->
str.empty()) {
12207 if (but_other->
icon && !but_other->
str.empty()) {
12214 return (event->
mval[0] <
int(
left) || event->
mval[0] >
int(right));
12264 if (
data->menu &&
data->menu->menuretval) {
12317 bool reset_pie =
false;
12354#ifdef USE_DRAG_TOGGLE
12474 const void *rna_poin_data,
12475 const char *rna_prop_id)
12477 uiBlock *block_text =
nullptr;
12478 uiBut *but_text =
nullptr;
12481 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
12483 if (but->rnaprop && but->rnapoin.data == rna_poin_data) {
12485 block_text = block;
12486 but_text = but.get();
12512 uiBlock *block_text =
nullptr;
12513 uiBut *but_text =
nullptr;
12516 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
12518 block_text = block;
12519 but_text = but.get();
12545 for (
const std::unique_ptr<uiBut> &but : block->buttons) {
12546 if (but->active ==
nullptr) {
12564 if (
data->menu ==
nullptr &&
data->searchbox ==
nullptr) {
12621 const bool is_click)
12626 int unique_retval_ids_len = 0;
12627 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
12629 unique_retval_ids_len++;
12634 unique_retval_ids_len = 0;
12635 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
12637 unique_retval_ids[unique_retval_ids_len++] = but->retval;
12641 if (unique_retval_ids_len > 1) {
12644 unique_retval_ids_len);
12645 unique_retval_ids =
static_cast<int *
>(
12646 MEM_reallocN(unique_retval_ids,
sizeof(*unique_retval_ids) * unique_retval_ids_len));
12655 return interaction;
12690 const bool is_click)
12692 if (
data->custom_interaction_handle) {
12701 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(Scene *scene, const 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)
size_t BLI_snprintf_rlen(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
char * STRNCPY(char(&dst)[N], const char *src)
size_t BLI_snprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) 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
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
int BLI_str_utf8_invalid_strip(char *str, size_t str_len) ATTR_NONNULL(1)
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(...)
@ UILST_SCROLL_TO_ACTIVE_ITEM
#define RGN_ALIGN_ENUM_FROM_MASK(align)
#define UI_LIST_AUTO_SIZE_THRESHOLD
@ UILST_LAYOUT_BIG_PREVIEW_GRID
@ 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])
BLI_INLINE void IMB_colormanagement_scene_linear_to_srgb_v3(float srgb[3], const float scene_linear[3])
Read Guarded memory(de)allocation.
#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
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
@ UI_BUT2_FORCE_SEMI_MODAL_ACTIVE
@ UI_BUT2_ACTIVATE_ON_INIT_NO_SELECT
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)
bool UI_view_item_drag_start(bContext &C, const blender::ui::AbstractViewItem &item)
#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)
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
@ UI_BLOCK_MOVEMOUSE_QUIT
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)
uiBlock *(*)(bContext *C, ARegion *region, void *arg1) uiBlockCreateFunc
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
bool UI_block_layout_needs_resolving(const uiBlock *block)
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 item(std::string text, int icon1, int icon2=0)
void activate(bContext &C)
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
float length(VecOp< float, D >) RET
#define MEM_reallocN(vmemh, len)
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_context_poll_operator(bContext *C, wmOperatorType *ot, const uiBut *but)
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 void ui_list_activate_row_from_index(bContext *C, ARegion *region, uiBut *listbox, uiList *ui_list, int index)
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)
void ui_handle_afterfunc_add_operator(wmOperatorType *ot, wmOperatorCallContext opcontext)
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_list_handle_click_drag(bContext *C, const uiList *ui_list, ARegion *region, const wmEvent *event)
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 bool ui_list_invoke_item_operator(bContext *C, const uiBut *context_but, wmOperatorType *ot, PointerRNA **properties)
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)
static int ui_list_activate_hovered_row(bContext *C, ARegion *region, const uiList *ui_list, const wmEvent *event, bool activate_dragging)
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 bool ui_list_is_hovering_draggable_but(bContext *C, const uiList *list, const ARegion *region, const wmEvent *event)
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)
#define UI_DRAG_MAP_SOFT_RANGE_PIXEL_MAX
static int ui_do_but_VIEW_ITEM(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
static void ui_handle_afterfunc_add_operator_ex(wmOperatorType *ot, PointerRNA **properties, wmOperatorCallContext opcontext, const uiBut *context_but)
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)
static void ui_apply_but_LISTROW(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *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_apply_but_TAB(bContext *C, uiBut *but, uiHandleButtonData *data)
uiBut * ui_but_find_mouse_over(const ARegion *region, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
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)
uiBlock *(*)(bContext *C, uiPopupBlockHandle *handle, void *arg1) uiBlockHandleCreateFunc
void ui_perceptual_to_scene_linear_space(uiBut *but, float rgb[3])
uiBut * ui_list_find_from_row(const ARegion *region, const uiBut *row_but) ATTR_WARN_UNUSED_RESULT
void ui_color_picker_hsv_to_rgb(const float r_cp[3], float rgb[3])
uiBut * ui_list_row_find_index(const ARegion *region, int index, uiBut *listbox) ATTR_WARN_UNUSED_RESULT
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
@ UI_PIE_ANIMATION_FINISHED
@ UI_PIE_INITIAL_DIRECTION
@ UI_PIE_GESTURE_END_WAIT
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)
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)
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
wmOperatorCallContext 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
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
wmOperatorCallContext opcontext
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
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
struct wmOperatorType * custom_activate_optype
struct PointerRNA * custom_drag_opptr
int * items_filter_neworder
struct wmOperatorType * custom_drag_optype
struct PointerRNA * custom_activate_opptr
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
wmOperatorCallContext opcontext
bool(* check)(bContext *C, wmOperator *op)
struct wmOperatorType * type
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)
void WM_event_drag_start_xy(const wmEvent *event, int r_xy[2])
int WM_event_drag_threshold(const wmEvent *event)
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_operator_name_call_ptr_with_depends_on_cursor(bContext *C, wmOperatorType *ot, wmOperatorCallContext opcontext, PointerRNA *properties, const wmEvent *event, const StringRef drawstr)
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)