diff options
Diffstat (limited to 'source/blender/editors/interface/interface.c')
-rw-r--r-- | source/blender/editors/interface/interface.c | 56 |
1 files changed, 47 insertions, 9 deletions
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 93f5a8e58d6..0b1d1c8c30c 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -209,6 +209,11 @@ void ui_window_to_region(const ARegion *ar, int *x, int *y) *y -= ar->winrct.ymin; } +void ui_region_to_window(const ARegion *ar, int *x, int *y) +{ + *x += ar->winrct.xmin; + *y += ar->winrct.ymin; +} /* ******************* block calc ************************* */ void ui_block_translate(uiBlock *block, int x, int y) @@ -723,6 +728,10 @@ static bool ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBu ui_but_update_linklines(block, oldbut, but); + if (!BLI_listbase_is_empty(&block->butstore)) { + UI_butstore_register_update(block, oldbut, but); + } + /* move/copy string from the new button to the old */ /* needed for alt+mouse wheel over enums */ if (but->str != but->strdata) { @@ -1712,6 +1721,9 @@ bool ui_but_is_bool(const uiBut *but) if (but->rnaprop && RNA_property_type(but->rnaprop) == PROP_BOOLEAN) return true; + if ((but->rnaprop && RNA_property_type(but->rnaprop) == PROP_ENUM) && (but->type == UI_BTYPE_ROW)) + return true; + return false; } @@ -2152,6 +2164,32 @@ bool ui_but_string_set_eval_num(bContext *C, uiBut *but, const char *str, double return ok; } +/* just the assignment/free part */ +static void ui_but_string_set_internal(uiBut *but, const char *str, size_t str_len) +{ + BLI_assert(str_len == strlen(str)); + BLI_assert(but->str == NULL); + str_len += 1; + + if (str_len > UI_MAX_NAME_STR) { + but->str = MEM_mallocN(str_len, "ui_def_but str"); + } + else { + but->str = but->strdata; + } + memcpy(but->str, str, str_len); +} + +static void ui_but_string_free_internal(uiBut *but) +{ + if (but->str) { + if (but->str != but->strdata) { + MEM_freeN(but->str); + } + /* must call 'ui_but_string_set_internal' after */ + but->str = NULL; + } +} bool ui_but_string_set(bContext *C, uiBut *but, const char *str) { @@ -2599,9 +2637,13 @@ void ui_but_update(uiBut *but) UI_GET_BUT_VALUE_INIT(but, value); if (value < (double)but->hardmin) ui_but_value_set(but, but->hardmin); else if (value > (double)but->hardmax) ui_but_value_set(but, but->hardmax); + + /* max must never be smaller than min! Both being equal is allowed though */ + BLI_assert(but->softmin <= but->softmax && + but->hardmin <= but->hardmax); break; - case UI_BTYPE_ICON_TOGGLE: + case UI_BTYPE_ICON_TOGGLE: case UI_BTYPE_ICON_TOGGLE_N: if (!but->rnaprop || (RNA_property_flag(but->rnaprop) & PROP_ICONS_CONSECUTIVE)) { if (but->flag & UI_SELECT) but->iconadd = 1; @@ -2631,7 +2673,9 @@ void ui_but_update(uiBut *but) if (RNA_property_enum_name_gettexted(but->block->evil_C, &but->rnapoin, but->rnaprop, value, &buf)) { - BLI_strncpy(but->str, buf, sizeof(but->strdata)); + size_t slen = strlen(buf); + ui_but_string_free_internal(but); + ui_but_string_set_internal(but, buf, slen); } } } @@ -3039,13 +3083,7 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, const char *str, but->retval = retval; slen = strlen(str); - if (slen >= UI_MAX_NAME_STR) { - but->str = MEM_mallocN(slen + 1, "ui_def_but str"); - } - else { - but->str = but->strdata; - } - memcpy(but->str, str, slen + 1); + ui_but_string_set_internal(but, str, slen); but->rect.xmin = x; but->rect.ymin = y; |