Cleanup: Use std::string for UI drop box tooltip return type

And use fmt for formatting strings.
This commit is contained in:
Hans Goudey
2024-01-19 10:45:33 -05:00
parent b2ef92361f
commit 7ca4dcac5a
13 changed files with 118 additions and 128 deletions

View File

@@ -8,6 +8,8 @@
#pragma once
#include <string>
#include "BLI_compiler_attrs.h"
#include "BLI_string_ref.hh"
@@ -248,10 +250,12 @@ Base *ED_object_add_duplicate(
Main *bmain, Scene *scene, ViewLayer *view_layer, Base *base, eDupli_ID_Flags dupflag);
void ED_object_parent(Object *ob, Object *parent, int type, const char *substr);
char *ED_object_ot_drop_named_material_tooltip(bContext *C, const char *name, const int mval[2]);
char *ED_object_ot_drop_geometry_nodes_tooltip(bContext *C,
PointerRNA *properties,
const int mval[2]);
std::string ED_object_ot_drop_named_material_tooltip(bContext *C,
const char *name,
const int mval[2]);
std::string ED_object_ot_drop_geometry_nodes_tooltip(bContext *C,
PointerRNA *properties,
const int mval[2]);
/* bitflags for enter/exit editmode */
enum {

View File

@@ -179,10 +179,10 @@ bool drop_target_apply_drop(bContext &C,
* Call #DropTargetInterface::drop_tooltip() and return the result as newly allocated C string
* (unless the result is empty, returns null then). Needs freeing with MEM_freeN().
*/
char *drop_target_tooltip(const ARegion &region,
const DropTargetInterface &drop_target,
const wmDrag &drag,
const wmEvent &event);
std::string drop_target_tooltip(const ARegion &region,
const DropTargetInterface &drop_target,
const wmDrag &drag,
const wmEvent &event);
std::unique_ptr<DropTargetInterface> view_drop_target(uiViewHandle *view_handle);
std::unique_ptr<DropTargetInterface> view_item_drop_target(uiViewItemHandle *item_handle);

View File

@@ -3171,7 +3171,7 @@ void UI_fontstyle_draw_simple(
void UI_fontstyle_draw_simple_backdrop(const uiFontStyle *fs,
float x,
float y,
const char *str,
blender::StringRef str,
const float col_fg[4],
const float col_bg[4]);

View File

@@ -48,10 +48,10 @@ bool drop_target_apply_drop(bContext &C,
return false;
}
char *drop_target_tooltip(const ARegion &region,
const DropTargetInterface &drop_target,
const wmDrag &drag,
const wmEvent &event)
std::string drop_target_tooltip(const ARegion &region,
const DropTargetInterface &drop_target,
const wmDrag &drag,
const wmEvent &event)
{
const char *disabled_hint_dummy = nullptr;
if (!drop_target.can_drop(drag, &disabled_hint_dummy)) {
@@ -65,8 +65,7 @@ char *drop_target_tooltip(const ARegion &region,
}
const DragInfo drag_info{drag, event, *drop_location};
const std::string tooltip = drop_target.drop_tooltip(drag_info);
return tooltip.empty() ? nullptr : BLI_strdup(tooltip.c_str());
return drop_target.drop_tooltip(drag_info);
}
} // namespace blender::ui

View File

@@ -6,6 +6,8 @@
* \ingroup edinterface
*/
#include <fmt/format.h>
#include "BKE_context.hh"
#include "BLI_string.h"
@@ -47,7 +49,10 @@ static bool ui_view_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
return drop_target->can_drop(*drag, &drag->drop_state.disabled_info);
}
static char *ui_view_drop_tooltip(bContext *C, wmDrag *drag, const int xy[2], wmDropBox * /*drop*/)
static std::string ui_view_drop_tooltip(bContext *C,
wmDrag *drag,
const int xy[2],
wmDropBox * /*drop*/)
{
const wmWindow *win = CTX_wm_window(C);
const ARegion *region = CTX_wm_region(C);
@@ -91,10 +96,10 @@ static void ui_drop_material_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
RNA_int_set(drop->ptr, "session_uuid", int(id->session_uuid));
}
static char *ui_drop_material_tooltip(bContext *C,
wmDrag *drag,
const int /*xy*/[2],
wmDropBox * /*drop*/)
static std::string ui_drop_material_tooltip(bContext *C,
wmDrag *drag,
const int /*xy*/[2],
wmDropBox * /*drop*/)
{
PointerRNA rna_ptr = CTX_data_pointer_get_type(C, "object", &RNA_Object);
Object *ob = (Object *)rna_ptr.data;
@@ -109,25 +114,21 @@ static char *ui_drop_material_tooltip(bContext *C,
Material *prev_mat_in_slot = (Material *)rna_prev_material.data;
const char *dragged_material_name = WM_drag_get_item_name(drag);
char *result;
if (prev_mat_in_slot) {
const char *tooltip = TIP_("Drop %s on slot %d (replacing %s) of %s");
result = BLI_sprintfN(tooltip,
dragged_material_name,
target_slot,
prev_mat_in_slot->id.name + 2,
ob->id.name + 2);
return fmt::format(TIP_("Drop {} on slot {} (replacing {}) of {}"),
dragged_material_name,
target_slot,
prev_mat_in_slot->id.name + 2,
ob->id.name + 2);
}
else if (target_slot == ob->actcol) {
const char *tooltip = TIP_("Drop %s on slot %d (active slot) of %s");
result = BLI_sprintfN(tooltip, dragged_material_name, target_slot, ob->id.name + 2);
if (target_slot == ob->actcol) {
return fmt::format(TIP_("Drop {} on slot {} (active slot) of {}"),
dragged_material_name,
target_slot,
ob->id.name + 2);
}
else {
const char *tooltip = TIP_("Drop %s on slot %d of %s");
result = BLI_sprintfN(tooltip, dragged_material_name, target_slot, ob->id.name + 2);
}
return result;
return fmt::format(
TIP_("Drop {} on slot {} of {}"), dragged_material_name, target_slot, ob->id.name + 2);
}
/** \} */

View File

@@ -279,14 +279,14 @@ void UI_fontstyle_draw_simple(
void UI_fontstyle_draw_simple_backdrop(const uiFontStyle *fs,
float x,
float y,
const char *str,
const blender::StringRef str,
const float col_fg[4],
const float col_bg[4])
{
UI_fontstyle_set(fs);
{
const int width = BLF_width(fs->uifont_id, str, BLF_DRAW_STR_DUMMY_MAX);
const int width = BLF_width(fs->uifont_id, str.data(), str.size());
const int height = BLF_height_max(fs->uifont_id);
const int decent = BLF_descender(fs->uifont_id);
const float margin = height / 4.0f;
@@ -302,7 +302,7 @@ void UI_fontstyle_draw_simple_backdrop(const uiFontStyle *fs,
BLF_position(fs->uifont_id, x, y, 0.0f);
BLF_color4fv(fs->uifont_id, col_fg);
BLF_draw(fs->uifont_id, str, BLF_DRAW_STR_DUMMY_MAX);
BLF_draw(fs->uifont_id, str.data(), str.size());
}
/* ************** helpers ************************ */

View File

@@ -223,19 +223,19 @@ static bool drop_import_file_poll(bContext *C, wmDrag *drag, const wmEvent * /*e
return !drop_import_file_poll_file_handlers(C, paths, true).is_empty();
}
static char *drop_import_file_tooltip(bContext *C,
wmDrag *drag,
const int /*xy*/[2],
wmDropBox * /*drop*/)
static std::string drop_import_file_tooltip(bContext *C,
wmDrag *drag,
const int /*xy*/[2],
wmDropBox * /*drop*/)
{
const auto paths = WM_drag_get_paths(drag);
const auto file_handlers = drop_import_file_poll_file_handlers(C, paths, true);
if (file_handlers.size() == 1) {
wmOperatorType *ot = WM_operatortype_find(file_handlers[0]->import_operator, false);
return BLI_strdup(TIP_(ot->name));
return TIP_(ot->name);
}
return BLI_strdup(TIP_("Multiple file handlers can be used, drop to pick which to use"));
return TIP_("Multiple file handlers can be used, drop to pick which to use");
}
void ED_dropbox_drop_import_file()

View File

@@ -19,6 +19,7 @@ set(INC
../../render
../../shader_fx
../../windowmanager
../../../../extern/fmtlib/include
# RNA_prototypes.h
${CMAKE_BINARY_DIR}/source/blender/makesrna

View File

@@ -10,6 +10,8 @@
#include <cstdlib>
#include <cstring>
#include <fmt/format.h>
#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
@@ -2925,27 +2927,27 @@ void OBJECT_OT_make_single_user(wmOperatorType *ot)
/** \name Drop Named Material on Object Operator
* \{ */
char *ED_object_ot_drop_named_material_tooltip(bContext *C, const char *name, const int mval[2])
std::string ED_object_ot_drop_named_material_tooltip(bContext *C,
const char *name,
const int mval[2])
{
int mat_slot = 0;
Object *ob = ED_view3d_give_material_slot_under_cursor(C, mval, &mat_slot);
if (ob == nullptr) {
return BLI_strdup("");
return {};
}
mat_slot = max_ii(mat_slot, 1);
Material *prev_mat = BKE_object_material_get(ob, mat_slot);
char *result;
if (prev_mat) {
const char *tooltip = TIP_("Drop %s on %s (slot %d, replacing %s)");
result = BLI_sprintfN(tooltip, name, ob->id.name + 2, mat_slot, prev_mat->id.name + 2);
return fmt::format(TIP_("Drop {} on {} (slot {}, replacing {})"),
name,
ob->id.name + 2,
mat_slot,
prev_mat->id.name + 2);
}
else {
const char *tooltip = TIP_("Drop %s on %s (slot %d)");
result = BLI_sprintfN(tooltip, name, ob->id.name + 2, mat_slot);
}
return result;
return fmt::format(TIP_("Drop {} on {} (slot {})"), name, ob->id.name + 2, mat_slot);
}
static int drop_named_material_invoke(bContext *C, wmOperator *op, const wmEvent *event)
@@ -2996,23 +2998,23 @@ void OBJECT_OT_drop_named_material(wmOperatorType *ot)
/** \name Drop Geometry Nodes on Object Operator
* \{ */
char *ED_object_ot_drop_geometry_nodes_tooltip(bContext *C,
PointerRNA *properties,
const int mval[2])
std::string ED_object_ot_drop_geometry_nodes_tooltip(bContext *C,
PointerRNA *properties,
const int mval[2])
{
const Object *ob = ED_view3d_give_object_under_cursor(C, mval);
if (ob == nullptr) {
return BLI_strdup("");
return {};
}
const uint32_t session_uuid = RNA_int_get(properties, "session_uuid");
const ID *id = BKE_libblock_find_session_uuid(CTX_data_main(C), ID_NT, session_uuid);
if (!id) {
return BLI_strdup("");
return {};
}
const char *tooltip = TIP_("Add modifier with node group \"%s\" on object \"%s\"");
return BLI_sprintfN(tooltip, id->name, ob->id.name);
return fmt::format(
TIP_("Add modifier with node group \"{}\" on object \"{}\""), id->name, ob->id.name);
}
static bool check_geometry_node_group_sockets(wmOperator *op, const bNodeTree *tree)

View File

@@ -892,34 +892,28 @@ static bool datastack_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
return true;
}
static char *datastack_drop_tooltip(bContext * /*C*/,
wmDrag *drag,
const int /*xy*/[2],
wmDropBox * /*drop*/)
static std::string datastack_drop_tooltip(bContext * /*C*/,
wmDrag *drag,
const int /*xy*/[2],
wmDropBox * /*drop*/)
{
StackDropData *drop_data = static_cast<StackDropData *>(drag->poin);
switch (drop_data->drop_action) {
case DATA_STACK_DROP_REORDER:
return BLI_strdup(TIP_("Reorder"));
break;
return TIP_("Reorder");
case DATA_STACK_DROP_COPY:
if (drop_data->pchan_parent) {
return BLI_strdup(TIP_("Copy to bone"));
return TIP_("Copy to bone");
}
else {
return BLI_strdup(TIP_("Copy to object"));
}
break;
return TIP_("Copy to object");
case DATA_STACK_DROP_LINK:
if (drop_data->pchan_parent) {
return BLI_strdup(TIP_("Link all to bone"));
return TIP_("Link all to bone");
}
else {
return BLI_strdup(TIP_("Link all to object"));
}
break;
return TIP_("Link all to object");
}
return nullptr;
return {};
}
static void datastack_drop_link(bContext *C, StackDropData *drop_data)
@@ -1234,10 +1228,10 @@ static bool collection_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event
return false;
}
static char *collection_drop_tooltip(bContext *C,
wmDrag *drag,
const int xy[2],
wmDropBox * /*drop*/)
static std::string collection_drop_tooltip(bContext *C,
wmDrag *drag,
const int xy[2],
wmDropBox * /*drop*/)
{
wmWindow *win = CTX_wm_window(C);
const wmEvent *event = win ? win->eventstate : nullptr;
@@ -1268,23 +1262,17 @@ static char *collection_drop_tooltip(bContext *C,
switch (data.insert_type) {
case TE_INSERT_BEFORE:
if (te->prev && outliner_is_collection_tree_element(te->prev)) {
return BLI_strdup(tooltip_between);
return tooltip_between;
}
else {
return BLI_strdup(tooltip_before);
}
break;
return tooltip_before;
case TE_INSERT_AFTER:
if (te->next && outliner_is_collection_tree_element(te->next)) {
return BLI_strdup(tooltip_between);
return tooltip_between;
}
else {
return BLI_strdup(tooltip_after);
}
break;
return tooltip_after;
case TE_INSERT_INTO: {
if (is_link) {
return BLI_strdup(TIP_("Link inside collection"));
return TIP_("Link inside collection");
}
/* Check the type of the drag IDs to avoid the incorrect "Shift to parent"
@@ -1293,10 +1281,9 @@ static char *collection_drop_tooltip(bContext *C,
wmDragID *drag_id = (wmDragID *)drag->ids.first;
const bool is_object = (GS(drag_id->id->name) == ID_OB);
if (is_object) {
return BLI_strdup(TIP_("Move inside collection (Ctrl to link, Shift to parent)"));
return TIP_("Move inside collection (Ctrl to link, Shift to parent)");
}
return BLI_strdup(TIP_("Move inside collection (Ctrl to link)"));
break;
return TIP_("Move inside collection (Ctrl to link)");
}
}
}

View File

@@ -590,10 +590,10 @@ static bool view3d_mat_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event
return view3d_drop_id_in_main_region_poll(C, drag, event, ID_MA);
}
static char *view3d_mat_drop_tooltip(bContext *C,
wmDrag *drag,
const int xy[2],
wmDropBox * /*drop*/)
static std::string view3d_mat_drop_tooltip(bContext *C,
wmDrag *drag,
const int xy[2],
wmDropBox * /*drop*/)
{
const char *name = WM_drag_get_item_name(drag);
ARegion *region = CTX_wm_region(C);
@@ -618,12 +618,12 @@ static bool view3d_object_data_drop_poll(bContext *C, wmDrag *drag, const wmEven
return false;
}
static char *view3d_object_data_drop_tooltip(bContext * /*C*/,
wmDrag * /*drag*/,
const int /*xy*/[2],
wmDropBox * /*drop*/)
static std::string view3d_object_data_drop_tooltip(bContext * /*C*/,
wmDrag * /*drag*/,
const int /*xy*/[2],
wmDropBox * /*drop*/)
{
return BLI_strdup(TIP_("Create object instance from object-data"));
return TIP_("Create object instance from object-data");
}
static bool view3d_ima_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
@@ -726,10 +726,10 @@ static bool view3d_geometry_nodes_drop_poll(bContext *C, wmDrag *drag, const wmE
return true;
}
static char *view3d_geometry_nodes_drop_tooltip(bContext *C,
wmDrag * /*drag*/,
const int xy[2],
wmDropBox *drop)
static std::string view3d_geometry_nodes_drop_tooltip(bContext *C,
wmDrag * /*drag*/,
const int xy[2],
wmDropBox *drop)
{
ARegion *region = CTX_wm_region(C);
int mval[2] = {xy[0] - region->winrct.xmin, xy[1] - region->winrct.ymin};

View File

@@ -1224,10 +1224,10 @@ struct wmDragGreasePencilLayer {
GreasePencilLayer *layer;
};
using WMDropboxTooltipFunc = char *(*)(bContext *C,
wmDrag *drag,
const int xy[2],
wmDropBox *drop);
using WMDropboxTooltipFunc = std::string (*)(bContext *C,
wmDrag *drag,
const int xy[2],
wmDropBox *drop);
struct wmDragActiveDropState {
wmDragActiveDropState();

View File

@@ -417,18 +417,15 @@ void WM_drag_free_list(ListBase *lb)
}
}
static char *dropbox_tooltip(bContext *C, wmDrag *drag, const int xy[2], wmDropBox *drop)
static std::string dropbox_tooltip(bContext *C, wmDrag *drag, const int xy[2], wmDropBox *drop)
{
char *tooltip = nullptr;
if (drop->tooltip) {
tooltip = drop->tooltip(C, drag, xy, drop);
return drop->tooltip(C, drag, xy, drop);
}
if (!tooltip && drop->ot) {
tooltip = BLI_strdup(WM_operatortype_name(drop->ot, drop->ptr).c_str());
if (drop->ot) {
return WM_operatortype_name(drop->ot, drop->ptr);
}
/* XXX Doing translation here might not be ideal, but later we have no more
* access to ot (and hence op context)... */
return tooltip;
return {};
}
static wmDropBox *dropbox_active(bContext *C,
@@ -925,7 +922,7 @@ int WM_drag_get_path_file_type(const wmDrag *drag)
/* ************** draw ***************** */
static void wm_drop_operator_draw(const char *name, int x, int y)
static void wm_drop_operator_draw(const blender::StringRef name, int x, int y)
{
const uiFontStyle *fstyle = UI_FSTYLE_WIDGET;
@@ -940,7 +937,7 @@ static void wm_drop_operator_draw(const char *name, int x, int y)
UI_fontstyle_draw_simple_backdrop(fstyle, x, y, name, col_fg, col_bg);
}
static void wm_drop_redalert_draw(const char *redalert_str, int x, int y)
static void wm_drop_redalert_draw(const blender::StringRef redalert_str, int x, int y)
{
const uiFontStyle *fstyle = UI_FSTYLE_WIDGET;
const bTheme *btheme = UI_GetTheme();
@@ -1058,14 +1055,14 @@ static void wm_drag_draw_tooltip(bContext *C, wmWindow *win, wmDrag *drag, const
int iconsize = UI_ICON_SIZE;
int padding = 4 * UI_SCALE_FAC;
char *tooltip = nullptr;
std::string tooltip;
if (drag->drop_state.active_dropbox) {
tooltip = dropbox_tooltip(C, drag, xy, drag->drop_state.active_dropbox);
}
const bool has_disabled_info = drag->drop_state.disabled_info &&
drag->drop_state.disabled_info[0];
if (!tooltip && !has_disabled_info) {
if (tooltip.empty() && !has_disabled_info) {
return;
}
@@ -1095,9 +1092,8 @@ static void wm_drag_draw_tooltip(bContext *C, wmWindow *win, wmDrag *drag, const
}
}
if (tooltip) {
if (!tooltip.empty()) {
wm_drop_operator_draw(tooltip, x, y);
MEM_freeN(tooltip);
}
else if (has_disabled_info) {
wm_drop_redalert_draw(drag->drop_state.disabled_info, x, y);