T90371: Asset: Drop Material Tooltip.

This patch changes the drop named material tooltip to give feedback to
the user what is going to happen when they invoke the change.

There are 3 states:
* "": Operator will be canceled as not all data is present (dropping on
  background.)
* "Drop <named material> on <object name> (slot <slot number>, replacing
  <current material in slot>).
* "Drop <named material> on <object name> (slot <slot number).

Reviewed By: Severin

Maniphest Tasks: T90371

Differential Revision: https://developer.blender.org/D12106
This commit is contained in:
Jeroen Bakker 2021-08-04 08:58:19 +02:00
parent cd92b2350f
commit effc048710
Notes: blender-bot 2023-02-14 11:07:28 +01:00
Referenced by issue #90430, Blender crashes when dragging a material (from the materials tab, Outliner, even Asset Browser)
Referenced by issue #90371, As a user I want better feedback when dragging materials so it is clear what happens when dropping the material.
6 changed files with 58 additions and 10 deletions

View File

@ -53,6 +53,7 @@ struct uiLayout;
struct wmKeyConfig;
struct wmOperator;
struct wmOperatorType;
struct wmEvent;
/* object_edit.c */
/* context.object */
@ -199,6 +200,9 @@ void ED_object_parent(struct Object *ob,
struct Object *parent,
const int type,
const char *substr);
char *ED_object_ot_drop_named_material_tooltip(struct bContext *C,
struct PointerRNA *properties,
const struct wmEvent *event);
/* bitflags for enter/exit editmode */
enum {

View File

@ -2723,6 +2723,35 @@ 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,
PointerRNA *properties,
const wmEvent *event)
{
Base *base = ED_view3d_give_base_under_cursor(C, event->mval);
char name[MAX_ID_NAME - 2];
RNA_string_get(properties, "name", name);
if (base == NULL) {
return BLI_strdup("");
}
Object *ob = base->object;
int active_mat_slot = max_ii(ob->actcol, 1);
Material *prev_mat = BKE_object_material_get(ob, active_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, active_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, active_mat_slot);
}
return result;
}
static int drop_named_material_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
Main *bmain = CTX_data_main(C);

View File

@ -868,7 +868,8 @@ static bool datastack_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
static char *datastack_drop_tooltip(bContext *UNUSED(C),
wmDrag *drag,
const wmEvent *UNUSED(event))
const wmEvent *UNUSED(event),
struct wmDropBox *UNUSED(drop))
{
StackDropData *drop_data = drag->poin;
switch (drop_data->drop_action) {
@ -1191,7 +1192,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 wmEvent *event)
static char *collection_drop_tooltip(bContext *C,
wmDrag *drag,
const wmEvent *event,
wmDropBox *UNUSED(drop))
{
CollectionDrop data;
if (!event->shift && collection_drop_init(C, drag, event, &data)) {

View File

@ -53,6 +53,7 @@
#include "BKE_screen.h"
#include "BKE_workspace.h"
#include "ED_object.h"
#include "ED_render.h"
#include "ED_screen.h"
#include "ED_space_api.h"
@ -528,6 +529,16 @@ 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 wmEvent *event,
struct wmDropBox *drop)
{
wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, ID_MA);
RNA_string_set(drop->ptr, "name", asset_drag->name);
return ED_object_ot_drop_named_material_tooltip(C, drop->ptr, event);
}
static bool view3d_object_data_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
{
ID_Type id_type = view3d_drop_id_in_main_region_poll_get_id_type(C, drag, event);
@ -539,7 +550,8 @@ static bool view3d_object_data_drop_poll(bContext *C, wmDrag *drag, const wmEven
static char *view3d_object_data_drop_tooltip(bContext *UNUSED(C),
wmDrag *UNUSED(drag),
const wmEvent *UNUSED(event))
const wmEvent *UNUSED(event),
wmDropBox *UNUSED(drop))
{
return BLI_strdup(TIP_("Create object instance from object-data"));
}
@ -689,7 +701,7 @@ static void view3d_dropboxes(void)
view3d_mat_drop_poll,
view3d_id_drop_copy,
WM_drag_free_imported_drag_ID,
NULL);
view3d_mat_drop_tooltip);
WM_dropbox_add(lb,
"VIEW3D_OT_background_image_add",
view3d_ima_bg_drop_poll,

View File

@ -115,6 +115,7 @@ struct wmEvent;
struct wmOperator;
struct wmWindowManager;
struct wmDrag;
struct wmDropBox;
#include "BLI_compiler_attrs.h"
#include "DNA_listBase.h"
@ -937,7 +938,8 @@ typedef struct wmDragAsset {
typedef char *(*WMDropboxTooltipFunc)(struct bContext *,
struct wmDrag *,
const struct wmEvent *event);
const struct wmEvent *event,
struct wmDropBox *drop);
typedef struct wmDrag {
struct wmDrag *next, *prev;

View File

@ -220,14 +220,11 @@ void WM_drag_free_list(struct ListBase *lb)
}
}
static char *dropbox_tooltip(bContext *C,
wmDrag *drag,
const wmEvent *event,
const wmDropBox *drop)
static char *dropbox_tooltip(bContext *C, wmDrag *drag, const wmEvent *event, wmDropBox *drop)
{
char *tooltip = NULL;
if (drop->tooltip) {
tooltip = drop->tooltip(C, drag, event);
tooltip = drop->tooltip(C, drag, event, drop);
}
if (!tooltip) {
tooltip = BLI_strdup(WM_operatortype_name(drop->ot, drop->ptr));