Blender  V3.3
interface_dropboxes.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #include "BKE_context.h"
8 
9 #include "BLI_string.h"
10 #include "BLT_translation.h"
11 
12 #include "DNA_material_types.h"
13 #include "DNA_space_types.h"
14 
15 #include "MEM_guardedalloc.h"
16 
17 #include "RNA_access.h"
18 #include "RNA_prototypes.h"
19 
20 #include "WM_api.h"
21 
22 #include "UI_interface.h"
23 
24 /* -------------------------------------------------------------------- */
28 static bool ui_view_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
29 {
30  const ARegion *region = CTX_wm_region(C);
31  const uiViewItemHandle *hovered_item = UI_region_views_find_item_at(region, event->xy);
32  if (!hovered_item) {
33  return false;
34  }
35 
36  if (drag->drop_state.free_disabled_info) {
38  }
39 
40  drag->drop_state.free_disabled_info = false;
41  return UI_view_item_can_drop(hovered_item, drag, &drag->drop_state.disabled_info);
42 }
43 
45  wmDrag *drag,
46  const int xy[2],
47  wmDropBox *UNUSED(drop))
48 {
49  const ARegion *region = CTX_wm_region(C);
50  const uiViewItemHandle *hovered_item = UI_region_views_find_item_at(region, xy);
51  if (!hovered_item) {
52  return nullptr;
53  }
54 
55  return UI_view_item_drop_tooltip(hovered_item, drag);
56 }
57 
60 /* -------------------------------------------------------------------- */
64 static bool ui_drop_name_poll(struct bContext *C, wmDrag *drag, const wmEvent *UNUSED(event))
65 {
66  return UI_but_active_drop_name(C) && (drag->type == WM_DRAG_ID);
67 }
68 
69 static void ui_drop_name_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBox *drop)
70 {
71  const ID *id = WM_drag_get_local_ID(drag, 0);
72  RNA_string_set(drop->ptr, "string", id->name + 2);
73 }
74 
77 /* -------------------------------------------------------------------- */
81 static bool ui_drop_material_poll(bContext *C, wmDrag *drag, const wmEvent *UNUSED(event))
82 {
83  PointerRNA mat_slot = CTX_data_pointer_get_type(C, "material_slot", &RNA_MaterialSlot);
84  return WM_drag_is_ID_type(drag, ID_MA) && !RNA_pointer_is_null(&mat_slot);
85 }
86 
87 static void ui_drop_material_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBox *drop)
88 {
90  RNA_int_set(drop->ptr, "session_uuid", (int)id->session_uuid);
91 }
92 
94  wmDrag *drag,
95  const int UNUSED(xy[2]),
96  struct wmDropBox *UNUSED(drop))
97 {
98  PointerRNA rna_ptr = CTX_data_pointer_get_type(C, "object", &RNA_Object);
99  Object *ob = (Object *)rna_ptr.data;
100  BLI_assert(ob);
101 
102  PointerRNA mat_slot = CTX_data_pointer_get_type(C, "material_slot", &RNA_MaterialSlot);
103  BLI_assert(mat_slot.data);
104 
105  const int target_slot = RNA_int_get(&mat_slot, "slot_index") + 1;
106 
107  PointerRNA rna_prev_material = RNA_pointer_get(&mat_slot, "material");
108  Material *prev_mat_in_slot = (Material *)rna_prev_material.data;
109  const char *dragged_material_name = WM_drag_get_item_name(drag);
110 
111  char *result;
112  if (prev_mat_in_slot) {
113  const char *tooltip = TIP_("Drop %s on slot %d (replacing %s) of %s");
114  result = BLI_sprintfN(tooltip,
115  dragged_material_name,
116  target_slot,
117  prev_mat_in_slot->id.name + 2,
118  ob->id.name + 2);
119  }
120  else if (target_slot == ob->actcol) {
121  const char *tooltip = TIP_("Drop %s on slot %d (active slot) of %s");
122  result = BLI_sprintfN(tooltip, dragged_material_name, target_slot, ob->id.name + 2);
123  }
124  else {
125  const char *tooltip = TIP_("Drop %s on slot %d of %s");
126  result = BLI_sprintfN(tooltip, dragged_material_name, target_slot, ob->id.name + 2);
127  }
128 
129  return result;
130 }
131 
134 /* -------------------------------------------------------------------- */
139 {
140  ListBase *lb = WM_dropboxmap_find("User Interface", SPACE_EMPTY, 0);
141 
142  WM_dropbox_add(lb, "UI_OT_view_drop", ui_view_drop_poll, nullptr, nullptr, ui_view_drop_tooltip);
143  WM_dropbox_add(lb,
144  "UI_OT_drop_name",
148  nullptr);
149  WM_dropbox_add(lb,
150  "UI_OT_drop_material",
155 }
156 
PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type)
Definition: context.c:473
struct ARegion * CTX_wm_region(const bContext *C)
Definition: context.c:749
#define BLI_assert(a)
Definition: BLI_assert.h:46
size_t size_t char * BLI_sprintfN(const char *__restrict format,...) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_PRINTF_FORMAT(1
#define UNUSED(x)
#define TIP_(msgid)
@ ID_MA
Definition: DNA_ID_enums.h:51
@ SPACE_EMPTY
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
#define C
Definition: RandGen.cpp:25
uiViewItemHandle * UI_region_views_find_item_at(const struct ARegion *region, const int xy[2]) ATTR_NONNULL()
bool UI_but_active_drop_name(const struct bContext *C)
bool UI_view_item_can_drop(const uiViewItemHandle *item_, const struct wmDrag *drag, const char **r_disabled_hint)
struct uiViewItemHandle uiViewItemHandle
Definition: UI_interface.h:78
char * UI_view_item_drop_tooltip(const uiViewItemHandle *item, const struct wmDrag *drag)
#define WM_DRAG_ID
Definition: WM_types.h:1043
void ED_dropboxes_ui()
static char * ui_drop_material_tooltip(bContext *C, wmDrag *drag, const int UNUSED(xy[2]), struct wmDropBox *UNUSED(drop))
static bool ui_drop_material_poll(bContext *C, wmDrag *drag, const wmEvent *UNUSED(event))
static bool ui_drop_name_poll(struct bContext *C, wmDrag *drag, const wmEvent *UNUSED(event))
static void ui_drop_name_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBox *drop)
static void ui_drop_material_copy(bContext *UNUSED(C), wmDrag *drag, wmDropBox *drop)
static char * ui_view_drop_tooltip(bContext *C, wmDrag *drag, const int xy[2], wmDropBox *UNUSED(drop))
static bool ui_view_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
Definition: rna_access.c:5155
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5167
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
Definition: rna_access.c:4921
int RNA_int_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:4910
bool RNA_pointer_is_null(const PointerRNA *ptr)
Definition: rna_access.c:164
Definition: DNA_ID.h:368
unsigned int session_uuid
Definition: DNA_ID.h:407
char name[66]
Definition: DNA_ID.h:378
void * data
Definition: RNA_types.h:38
const char * disabled_info
Definition: WM_types.h:1139
wmDragActiveDropState drop_state
Definition: WM_types.h:1157
int type
Definition: WM_types.h:1148
struct PointerRNA * ptr
Definition: WM_types.h:1237
int xy[2]
Definition: WM_types.h:682
ID * WM_drag_get_local_ID_or_import_from_asset(const wmDrag *drag, int idcode)
Definition: wm_dragdrop.cc:667
void WM_drag_free_imported_drag_ID(Main *bmain, wmDrag *drag, wmDropBox *drop)
Free asset ID imported for canceled drop.
Definition: wm_dragdrop.cc:686
ID * WM_drag_get_local_ID(const wmDrag *drag, short idcode)
Definition: wm_dragdrop.cc:531
bool WM_drag_is_ID_type(const wmDrag *drag, int idcode)
Definition: wm_dragdrop.cc:556
ListBase * WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
Definition: wm_dragdrop.cc:76
const char * WM_drag_get_item_name(wmDrag *drag)
Definition: wm_dragdrop.cc:787
wmDropBox * WM_dropbox_add(ListBase *lb, const char *idname, bool(*poll)(bContext *, wmDrag *, const wmEvent *), void(*copy)(bContext *, wmDrag *, wmDropBox *), void(*cancel)(Main *, wmDrag *, wmDropBox *), WMDropboxTooltipFunc tooltip)
Definition: wm_dragdrop.cc:95
int xy[2]
Definition: wm_draw.c:135