WIP: Brush assets project #106303

Draft
Julian Eisel wants to merge 370 commits from brush-assets-project into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
8 changed files with 55 additions and 109 deletions
Showing only changes of commit 96041c9516 - Show all commits

View File

@ -13,6 +13,8 @@
#include <cstddef> /* `offsetof()` */ #include <cstddef> /* `offsetof()` */
#include <cstring> #include <cstring>
#include <fmt/format.h>
#include "MEM_guardedalloc.h" #include "MEM_guardedalloc.h"
#include "DNA_object_types.h" #include "DNA_object_types.h"
@ -466,7 +468,7 @@ void ui_block_bounds_calc(uiBlock *block)
/* hardcoded exception... but that one is annoying with larger safety */ /* hardcoded exception... but that one is annoying with larger safety */
uiBut *bt = static_cast<uiBut *>(block->buttons.first); uiBut *bt = static_cast<uiBut *>(block->buttons.first);
const int xof = ((bt && STRPREFIX(bt->str, "ERROR")) ? 10 : 40) * UI_SCALE_FAC; const int xof = ((bt && STRPREFIX(bt->str.c_str(), "ERROR")) ? 10 : 40) * UI_SCALE_FAC;
block->safety.xmin = block->rect.xmin - xof; block->safety.xmin = block->rect.xmin - xof;
block->safety.ymin = block->rect.ymin - xof; block->safety.ymin = block->rect.ymin - xof;
@ -918,22 +920,7 @@ static void ui_but_update_old_active_from_new(uiBut *oldbut, uiBut *but)
/* move/copy string from the new button to the old */ /* move/copy string from the new button to the old */
/* needed for alt+mouse wheel over enums */ /* needed for alt+mouse wheel over enums */
if (but->str != but->strdata) { std::swap(but->str, oldbut->str);
if (oldbut->str != oldbut->strdata) {
std::swap(but->str, oldbut->str);
}
else {
oldbut->str = but->str;
but->str = but->strdata;
}
}
else {
if (oldbut->str != oldbut->strdata) {
MEM_freeN(oldbut->str);
oldbut->str = oldbut->strdata;
}
STRNCPY(oldbut->strdata, but->strdata);
}
if (but->dragpoin) { if (but->dragpoin) {
std::swap(but->dragpoin, oldbut->dragpoin); std::swap(but->dragpoin, oldbut->dragpoin);
@ -1161,11 +1148,11 @@ static void ui_menu_block_set_keyaccels(uiBlock *block)
continue; continue;
} }
if (but->str == nullptr || but->str[0] == '\0') { if (but->str.empty()) {
continue; continue;
} }
const char *str_pt = but->str; const char *str_pt = but->str.c_str();
uchar menu_key; uchar menu_key;
do { do {
menu_key = tolower(*str_pt); menu_key = tolower(*str_pt);
@ -1214,9 +1201,9 @@ static void ui_menu_block_set_keyaccels(uiBlock *block)
void ui_but_add_shortcut(uiBut *but, const char *shortcut_str, const bool do_strip) void ui_but_add_shortcut(uiBut *but, const char *shortcut_str, const bool do_strip)
{ {
if (do_strip && (but->flag & UI_BUT_HAS_SEP_CHAR)) { if (do_strip && (but->flag & UI_BUT_HAS_SEP_CHAR)) {
char *cpoin = strrchr(but->str, UI_SEP_CHAR); const size_t sep_index = but->str.find_first_of(UI_SEP_CHAR);
if (cpoin) { if (sep_index != std::string::npos) {
*cpoin = '\0'; but->str = but->str.substr(0, sep_index);
} }
but->flag &= ~UI_BUT_HAS_SEP_CHAR; but->flag &= ~UI_BUT_HAS_SEP_CHAR;
} }
@ -1226,16 +1213,7 @@ void ui_but_add_shortcut(uiBut *but, const char *shortcut_str, const bool do_str
return; return;
} }
char *butstr_orig; but->str = fmt::format("{}" UI_SEP_CHAR_S "{}", but->str, shortcut_str);
if (but->str != but->strdata) {
butstr_orig = but->str; /* free after using as source buffer */
}
else {
butstr_orig = BLI_strdup(but->str);
}
SNPRINTF(but->strdata, "%s" UI_SEP_CHAR_S "%s", butstr_orig, shortcut_str);
MEM_freeN(butstr_orig);
but->str = but->strdata;
but->flag |= UI_BUT_HAS_SEP_CHAR; but->flag |= UI_BUT_HAS_SEP_CHAR;
ui_but_update(but); ui_but_update(but);
} }
@ -3138,27 +3116,7 @@ bool ui_but_string_eval_number(bContext *C, const uiBut *but, const char *str, d
static void ui_but_string_set_internal(uiBut *but, const char *str, size_t str_len) static void ui_but_string_set_internal(uiBut *but, const char *str, size_t str_len)
{ {
BLI_assert(str_len == strlen(str)); BLI_assert(str_len == strlen(str));
BLI_assert(but->str == nullptr); but->str = std::string(str, str_len);
str_len += 1;
if (str_len > UI_MAX_NAME_STR) {
but->str = static_cast<char *>(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 = nullptr;
}
} }
bool ui_but_string_set(bContext *C, uiBut *but, const char *str) bool ui_but_string_set(bContext *C, uiBut *but, const char *str)
@ -3509,9 +3467,6 @@ static void ui_but_free(const bContext *C, uiBut *but)
} }
} }
} }
if (but->str && but->str != but->strdata) {
MEM_freeN(but->str);
}
if ((but->type == UI_BTYPE_IMAGE) && but->poin) { if ((but->type == UI_BTYPE_IMAGE) && but->poin) {
IMB_freeImBuf((ImBuf *)but->poin); IMB_freeImBuf((ImBuf *)but->poin);
@ -3736,7 +3691,7 @@ void UI_block_set_search_only(uiBlock *block, bool search_only)
static void ui_but_build_drawstr_float(uiBut *but, double value) static void ui_but_build_drawstr_float(uiBut *but, double value)
{ {
size_t slen = 0; size_t slen = 0;
STR_CONCAT(but->drawstr, slen, but->str); STR_CONCAT(but->drawstr, slen, but->str.c_str());
PropertySubType subtype = PROP_NONE; PropertySubType subtype = PROP_NONE;
if (but->rnaprop) { if (but->rnaprop) {
@ -3784,7 +3739,7 @@ static void ui_but_build_drawstr_float(uiBut *but, double value)
static void ui_but_build_drawstr_int(uiBut *but, int value) static void ui_but_build_drawstr_int(uiBut *but, int value)
{ {
size_t slen = 0; size_t slen = 0;
STR_CONCAT(but->drawstr, slen, but->str); STR_CONCAT(but->drawstr, slen, but->str.c_str());
PropertySubType subtype = PROP_NONE; PropertySubType subtype = PROP_NONE;
if (but->rnaprop) { if (but->rnaprop) {
@ -3878,13 +3833,13 @@ static void ui_but_update_ex(uiBut *but, const bool validate)
&item)) &item))
{ {
const size_t slen = strlen(item.name); const size_t slen = strlen(item.name);
ui_but_string_free_internal(but); but->str.clear();
ui_but_string_set_internal(but, item.name, slen); ui_but_string_set_internal(but, item.name, slen);
but->icon = item.icon; but->icon = item.icon;
} }
} }
} }
STRNCPY(but->drawstr, but->str); STRNCPY(but->drawstr, but->str.c_str());
} }
break; break;
@ -3906,10 +3861,10 @@ static void ui_but_update_ex(uiBut *but, const bool validate)
if (ui_but_is_float(but)) { if (ui_but_is_float(but)) {
UI_GET_BUT_VALUE_INIT(but, value); UI_GET_BUT_VALUE_INIT(but, value);
const int prec = ui_but_calc_float_precision(but, value); const int prec = ui_but_calc_float_precision(but, value);
SNPRINTF(but->drawstr, "%s%.*f", but->str, prec, value); SNPRINTF(but->drawstr, "%s%.*f", but->str.c_str(), prec, value);
} }
else { else {
STRNCPY(but->drawstr, but->str); STRNCPY(but->drawstr, but->str.c_str());
} }
break; break;
@ -3920,7 +3875,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate)
char str[UI_MAX_DRAW_STR]; char str[UI_MAX_DRAW_STR];
ui_but_string_get(but, str, UI_MAX_DRAW_STR); ui_but_string_get(but, str, UI_MAX_DRAW_STR);
SNPRINTF(but->drawstr, "%s%s", but->str, str); SNPRINTF(but->drawstr, "%s%s", but->str.c_str(), str);
} }
break; break;
@ -3933,7 +3888,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate)
UI_GET_BUT_VALUE_INIT(but, value); UI_GET_BUT_VALUE_INIT(but, value);
str = WM_key_event_string(short(value), false); str = WM_key_event_string(short(value), false);
} }
SNPRINTF(but->drawstr, "%s%s", but->str, str); SNPRINTF(but->drawstr, "%s%s", but->str.c_str(), str);
break; break;
} }
case UI_BTYPE_HOTKEY_EVENT: case UI_BTYPE_HOTKEY_EVENT:
@ -3954,7 +3909,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate)
} }
} }
else { else {
STRNCPY_UTF8(but->drawstr, but->str); STRNCPY_UTF8(but->drawstr, but->str.c_str());
} }
break; break;
@ -3963,7 +3918,7 @@ static void ui_but_update_ex(uiBut *but, const bool validate)
case UI_BTYPE_HSVCIRCLE: case UI_BTYPE_HSVCIRCLE:
break; break;
default: default:
STRNCPY(but->drawstr, but->str); STRNCPY(but->drawstr, but->str.c_str());
break; break;
} }
@ -4082,7 +4037,6 @@ uiBut *ui_but_change_type(uiBut *but, eButType new_type)
const uiBut *old_but_ptr = but; const uiBut *old_but_ptr = but;
/* Button may have pointer to a member within itself, this will have to be updated. */ /* Button may have pointer to a member within itself, this will have to be updated. */
const bool has_str_ptr_to_self = but->str == but->strdata;
const bool has_poin_ptr_to_self = but->poin == (char *)but; const bool has_poin_ptr_to_self = but->poin == (char *)but;
/* Copy construct button with the new type. */ /* Copy construct button with the new type. */
@ -4090,9 +4044,6 @@ uiBut *ui_but_change_type(uiBut *but, eButType new_type)
*but = *old_but_ptr; *but = *old_but_ptr;
/* We didn't mean to override this :) */ /* We didn't mean to override this :) */
but->type = new_type; but->type = new_type;
if (has_str_ptr_to_self) {
but->str = but->strdata;
}
if (has_poin_ptr_to_self) { if (has_poin_ptr_to_self) {
but->poin = (char *)but; but->poin = (char *)but;
} }
@ -4201,18 +4152,16 @@ static uiBut *ui_def_but(uiBlock *block,
but->pos = -1; /* cursor invisible */ but->pos = -1; /* cursor invisible */
if (ELEM(but->type, UI_BTYPE_NUM, UI_BTYPE_NUM_SLIDER)) { /* add a space to name */ if (ELEM(but->type, UI_BTYPE_NUM, UI_BTYPE_NUM_SLIDER)) { /* add a space to name */
/* slen remains unchanged from previous assignment, ensure this stays true */
if (slen > 0 && slen < UI_MAX_NAME_STR - 2) { if (slen > 0 && slen < UI_MAX_NAME_STR - 2) {
if (but->str[slen - 1] != ' ') { if (but->str[but->str.size() - 1] != ' ') {
but->str[slen] = ' '; but->str += ' ';
but->str[slen + 1] = 0;
} }
} }
} }
if (block->flag & UI_BLOCK_RADIAL) { if (block->flag & UI_BLOCK_RADIAL) {
but->drawflag |= UI_BUT_TEXT_LEFT; but->drawflag |= UI_BUT_TEXT_LEFT;
if (but->str && but->str[0]) { if (!but->str.empty()) {
but->drawflag |= UI_BUT_ICON_LEFT; but->drawflag |= UI_BUT_ICON_LEFT;
} }
} }
@ -4296,7 +4245,7 @@ void ui_def_but_icon(uiBut *but, const int icon, const int flag)
but->icon = icon; but->icon = icon;
but->flag |= flag; but->flag |= flag;
if (but->str && but->str[0]) { if (!but->str.empty()) {
but->drawflag |= UI_BUT_ICON_LEFT; but->drawflag |= UI_BUT_ICON_LEFT;
} }
} }
@ -6628,28 +6577,24 @@ void UI_but_string_info_get(bContext *C, uiBut *but, ...)
va_start(args, but); va_start(args, but);
while ((si = (uiStringInfo *)va_arg(args, void *))) { while ((si = (uiStringInfo *)va_arg(args, void *))) {
uiStringInfoType type = si->type; uiStringInfoType type = si->type;
char *tmp = nullptr; std::string tmp;
if (type == BUT_GET_TIP_LABEL) { if (type == BUT_GET_TIP_LABEL) {
if (but->tip_label_func) { if (but->tip_label_func) {
const std::string tooltip_label = but->tip_label_func(but); tmp = but->tip_label_func(but);
tmp = BLI_strdupn(tooltip_label.c_str(), tooltip_label.size());
} }
} }
if (type == BUT_GET_LABEL) { if (type == BUT_GET_LABEL) {
if (but->str && but->str[0]) { if (!but->str.empty()) {
const char *str_sep; size_t str_len = but->str.size();
size_t str_len; if (but->flag & UI_BUT_HAS_SEP_CHAR) {
const size_t sep_index = but->str.find_first_of(UI_SEP_CHAR);
if ((but->flag & UI_BUT_HAS_SEP_CHAR) && (str_sep = strrchr(but->str, UI_SEP_CHAR))) { if (sep_index != std::string::npos) {
str_len = (str_sep - but->str); str_len = sep_index;
}
} }
else { tmp = but->str.substr(0, str_len);
str_len = strlen(but->str);
}
tmp = BLI_strdupn(but->str, str_len);
} }
else { else {
type = BUT_GET_RNA_LABEL; /* Fail-safe solution... */ type = BUT_GET_RNA_LABEL; /* Fail-safe solution... */
@ -6734,7 +6679,7 @@ void UI_but_string_info_get(bContext *C, uiBut *but, ...)
} }
} }
if (tmp == nullptr) { if (tmp.empty()) {
wmOperatorType *ot = UI_but_operatortype_get_from_enum_menu(but, nullptr); wmOperatorType *ot = UI_but_operatortype_get_from_enum_menu(but, nullptr);
if (ot) { if (ot) {
if (type == BUT_GET_RNA_LABEL) { if (type == BUT_GET_RNA_LABEL) {
@ -6746,7 +6691,7 @@ void UI_but_string_info_get(bContext *C, uiBut *but, ...)
} }
} }
if (tmp == nullptr) { if (tmp.empty()) {
PanelType *pt = UI_but_paneltype_get(but); PanelType *pt = UI_but_paneltype_get(but);
if (pt) { if (pt) {
if (type == BUT_GET_RNA_LABEL) { if (type == BUT_GET_RNA_LABEL) {
@ -6859,7 +6804,7 @@ void UI_but_string_info_get(bContext *C, uiBut *but, ...)
} }
} }
si->strinfo = tmp; si->strinfo = BLI_strdupn(tmp.c_str(), tmp.size());
} }
va_end(args); va_end(args);

View File

@ -178,8 +178,8 @@ struct uiBut {
short bit = 0, bitnr = 0, retval = 0, strwidth = 0, alignnr = 0; short bit = 0, bitnr = 0, retval = 0, strwidth = 0, alignnr = 0;
short ofs = 0, pos = 0, selsta = 0, selend = 0; short ofs = 0, pos = 0, selsta = 0, selend = 0;
char *str = nullptr; std::string str;
char strdata[UI_MAX_NAME_STR] = "";
char drawstr[UI_MAX_DRAW_STR] = ""; char drawstr[UI_MAX_DRAW_STR] = "";
char *placeholder = nullptr; char *placeholder = nullptr;

View File

@ -2536,7 +2536,7 @@ void uiItemFullR(uiLayout *layout,
/* ensure text isn't added to icon_only buttons */ /* ensure text isn't added to icon_only buttons */
if (but && icon_only) { if (but && icon_only) {
BLI_assert(but->str[0] == '\0'); BLI_assert(but->str.empty());
} }
} }
@ -2863,7 +2863,7 @@ uiBut *ui_but_add_search(uiBut *but,
if (RNA_property_type(prop) == PROP_ENUM) { if (RNA_property_type(prop) == PROP_ENUM) {
/* XXX, this will have a menu string, /* XXX, this will have a menu string,
* but in this case we just want the text */ * but in this case we just want the text */
but->str[0] = 0; but->str.clear();
} }
UI_but_func_search_set_results_are_suggestions(but, results_are_suggestions); UI_but_func_search_set_results_are_suggestions(but, results_are_suggestions);
@ -3602,7 +3602,7 @@ static int menu_item_enum_opname_menu_active(bContext *C, uiBut *but, MenuItemLe
WM_operator_properties_sanitize(&ptr, false); WM_operator_properties_sanitize(&ptr, false);
PropertyRNA *prop = RNA_struct_find_property(&ptr, lvl->propname); PropertyRNA *prop = RNA_struct_find_property(&ptr, lvl->propname);
RNA_property_enum_items_gettexted(C, &ptr, prop, &item_array, &totitem, &free); RNA_property_enum_items_gettexted(C, &ptr, prop, &item_array, &totitem, &free);
int active = RNA_enum_from_name(item_array, but->str); int active = RNA_enum_from_name(item_array, but->str.c_str());
if (free) { if (free) {
MEM_freeN((void *)item_array); MEM_freeN((void *)item_array);
} }
@ -5405,7 +5405,7 @@ static bool block_search_panel_label_matches(const uiBlock *block, const char *s
static bool button_matches_search_filter(uiBut *but, const char *search_filter) static bool button_matches_search_filter(uiBut *but, const char *search_filter)
{ {
/* Do the shorter checks first for better performance in case there is a match. */ /* Do the shorter checks first for better performance in case there is a match. */
if (BLI_strcasestr(but->str, search_filter)) { if (BLI_strcasestr(but->str.c_str(), search_filter)) {
return true; return true;
} }
@ -5891,7 +5891,7 @@ void ui_layout_add_but(uiLayout *layout, uiBut *but)
ui_item_size((uiItem *)bitem, &w, &h); ui_item_size((uiItem *)bitem, &w, &h);
/* XXX uiBut hasn't scaled yet /* XXX uiBut hasn't scaled yet
* we can flag the button as not expandable, depending on its size */ * we can flag the button as not expandable, depending on its size */
if (w <= 2 * UI_UNIT_X && (!but->str || but->str[0] == '\0')) { if (w <= 2 * UI_UNIT_X && but->str.empty()) {
bitem->item.flag |= UI_ITEM_FIXED_SIZE; bitem->item.flag |= UI_ITEM_FIXED_SIZE;
} }
@ -6166,7 +6166,7 @@ static bool ui_layout_has_panel_label(const uiLayout *layout, const PanelType *p
if (subitem->type == ITEM_BUTTON) { if (subitem->type == ITEM_BUTTON) {
uiButtonItem *bitem = (uiButtonItem *)subitem; uiButtonItem *bitem = (uiButtonItem *)subitem;
if (!(bitem->but->flag & UI_HIDDEN) && if (!(bitem->but->flag & UI_HIDDEN) &&
STREQ(bitem->but->str, CTX_IFACE_(pt->translation_context, pt->label))) STREQ(bitem->but->str.c_str(), CTX_IFACE_(pt->translation_context, pt->label)))
{ {
return true; return true;
} }

View File

@ -199,7 +199,7 @@ static void ui_update_color_picker_buts_rgb(uiBut *from_but,
* push, so disable it on RNA buttons in the color picker block */ * push, so disable it on RNA buttons in the color picker block */
UI_but_flag_disable(bt, UI_BUT_UNDO); UI_but_flag_disable(bt, UI_BUT_UNDO);
} }
else if (STREQ(bt->str, "Hex:")) { else if (bt->str == "Hex:") {
float rgb_hex[3]; float rgb_hex[3];
uchar rgb_hex_uchar[3]; uchar rgb_hex_uchar[3];
char col[16]; char col[16];

View File

@ -180,7 +180,7 @@ uiPieMenu *UI_pie_menu_begin(bContext *C, const char *title, int icon, const wmE
} }
/* do not align left */ /* do not align left */
but->drawflag &= ~UI_BUT_TEXT_LEFT; but->drawflag &= ~UI_BUT_TEXT_LEFT;
pie->block_radial->pie_data.title = but->str; pie->block_radial->pie_data.title = but->str.c_str();
pie->block_radial->pie_data.icon = icon; pie->block_radial->pie_data.icon = icon;
} }

View File

@ -71,7 +71,7 @@ int ui_but_menu_step(uiBut *but, int direction)
direction); direction);
} }
printf("%s: cannot cycle button '%s'\n", __func__, but->str); printf("%s: cannot cycle button '%s'\n", __func__, but->str.c_str());
return 0; return 0;
} }
@ -124,7 +124,7 @@ static uiBut *ui_popup_menu_memory__internal(uiBlock *block, uiBut *but)
if (but) { if (but) {
/* set */ /* set */
mem[hash_mod] = ui_popup_string_hash(but->str, but->flag & UI_BUT_HAS_SEP_CHAR); mem[hash_mod] = ui_popup_string_hash(but->str.c_str(), but->flag & UI_BUT_HAS_SEP_CHAR);
return nullptr; return nullptr;
} }
@ -136,7 +136,8 @@ static uiBut *ui_popup_menu_memory__internal(uiBlock *block, uiBut *but)
if (ELEM(but_iter->type, UI_BTYPE_LABEL, UI_BTYPE_SEPR, UI_BTYPE_SEPR_LINE)) { if (ELEM(but_iter->type, UI_BTYPE_LABEL, UI_BTYPE_SEPR, UI_BTYPE_SEPR_LINE)) {
continue; continue;
} }
if (mem[hash_mod] == ui_popup_string_hash(but_iter->str, but_iter->flag & UI_BUT_HAS_SEP_CHAR)) if (mem[hash_mod] ==
ui_popup_string_hash(but_iter->str.c_str(), but_iter->flag & UI_BUT_HAS_SEP_CHAR))
{ {
return but_iter; return but_iter;
} }

View File

@ -298,7 +298,6 @@ static bool menu_items_to_ui_button(MenuSearch_Item *item, uiBut *but)
} }
but->icon = item->icon; but->icon = item->icon;
but->str = but->strdata;
} }
return changed; return changed;

View File

@ -1342,7 +1342,7 @@ static void widget_draw_icon(
if (but->drawflag & UI_BUT_ICON_LEFT) { if (but->drawflag & UI_BUT_ICON_LEFT) {
/* special case - icon_only pie buttons */ /* special case - icon_only pie buttons */
if (ui_block_is_pie_menu(but->block) && !ELEM(but->type, UI_BTYPE_MENU, UI_BTYPE_POPOVER) && if (ui_block_is_pie_menu(but->block) && !ELEM(but->type, UI_BTYPE_MENU, UI_BTYPE_POPOVER) &&
but->str && but->str[0] == '\0') but->str.empty())
{ {
xs = rect->xmin + 2.0f * ofs; xs = rect->xmin + 2.0f * ofs;
} }
@ -4960,7 +4960,8 @@ void ui_draw_but(const bContext *C, ARegion *region, uiStyle *style, uiBut *but,
/* We could use a flag for this, but for now just check size, /* We could use a flag for this, but for now just check size,
* add up/down arrows if there is room. */ * add up/down arrows if there is room. */
if ((!but->str[0] && but->icon && (BLI_rcti_size_x(rect) < BLI_rcti_size_y(rect) + 2)) || if ((but->str.empty() && but->icon &&
(BLI_rcti_size_x(rect) < BLI_rcti_size_y(rect) + 2)) ||
/* disable for brushes also */ /* disable for brushes also */
(but->flag & UI_BUT_ICON_PREVIEW)) (but->flag & UI_BUT_ICON_PREVIEW))
{ {