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:
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.
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue