Blender V4.3
interface_dropboxes.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <fmt/format.h>
10
11#include "BKE_context.hh"
12
13#include "BLT_translation.hh"
14
15#include "DNA_material_types.h"
16#include "DNA_space_types.h"
17
18#include "MEM_guardedalloc.h"
19
20#include "RNA_access.hh"
21#include "RNA_prototypes.hh"
22
23#include "WM_api.hh"
24
25#include "UI_interface.hh"
26
27using namespace blender::ui;
28
29/* -------------------------------------------------------------------- */
33static bool ui_view_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
34{
35 const ARegion *region = CTX_wm_region(C);
36
37 std::unique_ptr<DropTargetInterface> drop_target = region_views_find_drop_target_at(region,
38 event->xy);
39 if (!drop_target) {
40 return false;
41 }
42
45 }
46 drag->drop_state.free_disabled_info = false;
47
48 return drop_target->can_drop(*drag, &drag->drop_state.disabled_info);
49}
50
51static std::string ui_view_drop_tooltip(bContext *C,
52 wmDrag *drag,
53 const int xy[2],
54 wmDropBox * /*drop*/)
55{
56 const wmWindow *win = CTX_wm_window(C);
57 const ARegion *region = CTX_wm_region(C);
58 std::unique_ptr<DropTargetInterface> drop_target = region_views_find_drop_target_at(region, xy);
59
60 if (drop_target == nullptr) {
61 return {};
62 }
63
64 return drop_target_tooltip(*region, *drop_target, *drag, *win->eventstate);
65}
66
69/* -------------------------------------------------------------------- */
73static bool ui_drop_name_poll(bContext *C, wmDrag *drag, const wmEvent * /*event*/)
74{
75 return UI_but_active_drop_name(C) && (drag->type == WM_DRAG_ID);
76}
77
78static void ui_drop_name_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop)
79{
80 const ID *id = WM_drag_get_local_ID(drag, 0);
81 RNA_string_set(drop->ptr, "string", id->name + 2);
82}
83
86/* -------------------------------------------------------------------- */
90static bool ui_drop_material_poll(bContext *C, wmDrag *drag, const wmEvent * /*event*/)
91{
92 PointerRNA mat_slot = CTX_data_pointer_get_type(C, "material_slot", &RNA_MaterialSlot);
93 if (RNA_pointer_is_null(&mat_slot)) {
94 return false;
95 }
96 PointerRNA ob_ptr = CTX_data_pointer_get_type(C, "object", &RNA_Object);
97 if (RNA_pointer_is_null(&ob_ptr)) {
98 return false;
99 }
100
101 Object *ob = static_cast<Object *>(ob_ptr.data);
102
103 return WM_drag_is_ID_type(drag, ID_MA) && ID_IS_EDITABLE(&ob->id) &&
105}
106
107static void ui_drop_material_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
108{
110 RNA_int_set(drop->ptr, "session_uid", int(id->session_uid));
111}
112
113static std::string ui_drop_material_tooltip(bContext *C,
114 wmDrag *drag,
115 const int /*xy*/[2],
116 wmDropBox * /*drop*/)
117{
118 PointerRNA rna_ptr = CTX_data_pointer_get_type(C, "object", &RNA_Object);
119 Object *ob = (Object *)rna_ptr.data;
120 BLI_assert(ob);
121
122 PointerRNA mat_slot = CTX_data_pointer_get_type(C, "material_slot", &RNA_MaterialSlot);
123 BLI_assert(mat_slot.data);
124
125 const int target_slot = RNA_int_get(&mat_slot, "slot_index") + 1;
126
127 PointerRNA rna_prev_material = RNA_pointer_get(&mat_slot, "material");
128 Material *prev_mat_in_slot = (Material *)rna_prev_material.data;
129 const char *dragged_material_name = WM_drag_get_item_name(drag);
130
131 if (prev_mat_in_slot) {
132 return fmt::format(TIP_("Drop {} on slot {} (replacing {}) of {}"),
133 dragged_material_name,
134 target_slot,
135 prev_mat_in_slot->id.name + 2,
136 ob->id.name + 2);
137 }
138 if (target_slot == ob->actcol) {
139 return fmt::format(TIP_("Drop {} on slot {} (active slot) of {}"),
140 dragged_material_name,
141 target_slot,
142 ob->id.name + 2);
143 }
144 return fmt::format(
145 TIP_("Drop {} on slot {} of {}"), dragged_material_name, target_slot, ob->id.name + 2);
146}
147
150/* -------------------------------------------------------------------- */
155{
156 ListBase *lb = WM_dropboxmap_find("User Interface", SPACE_EMPTY, RGN_TYPE_WINDOW);
157
158 WM_dropbox_add(lb, "UI_OT_view_drop", ui_view_drop_poll, nullptr, nullptr, ui_view_drop_tooltip);
160 "UI_OT_drop_name",
164 nullptr);
166 "UI_OT_drop_material",
171}
172
PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type)
wmWindow * CTX_wm_window(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
#define BLI_assert(a)
Definition BLI_assert.h:50
#define TIP_(msgid)
#define ID_IS_EDITABLE(_id)
Definition DNA_ID.h:658
#define ID_IS_OVERRIDE_LIBRARY(_id)
Definition DNA_ID.h:683
@ ID_MA
@ RGN_TYPE_WINDOW
@ SPACE_EMPTY
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
bool UI_but_active_drop_name(const bContext *C)
@ WM_DRAG_ID
Definition WM_types.hh:1153
static void ui_drop_material_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
void ED_dropboxes_ui()
static bool ui_drop_material_poll(bContext *C, wmDrag *drag, const wmEvent *)
static void ui_drop_name_copy(bContext *, wmDrag *drag, wmDropBox *drop)
static std::string ui_view_drop_tooltip(bContext *C, wmDrag *drag, const int xy[2], wmDropBox *)
static bool ui_drop_name_poll(bContext *C, wmDrag *drag, const wmEvent *)
static std::string ui_drop_material_tooltip(bContext *C, wmDrag *drag, const int[2], wmDropBox *)
static bool ui_view_drop_poll(bContext *C, 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 > region_views_find_drop_target_at(const ARegion *region, const int xy[2])
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
int RNA_int_get(PointerRNA *ptr, const char *name)
bool RNA_pointer_is_null(const PointerRNA *ptr)
Definition DNA_ID.h:413
char name[66]
Definition DNA_ID.h:425
void * data
Definition RNA_types.hh:42
const char * disabled_info
Definition WM_types.hh:1272
eWM_DragDataType type
Definition WM_types.hh:1282
wmDragActiveDropState drop_state
Definition WM_types.hh:1289
PointerRNA * ptr
Definition WM_types.hh:1368
int xy[2]
Definition WM_types.hh:726
struct wmEvent * eventstate
wmDropBox * WM_dropbox_add(ListBase *lb, const char *idname, bool(*poll)(bContext *C, wmDrag *drag, const wmEvent *event), void(*copy)(bContext *C, wmDrag *drag, wmDropBox *drop), void(*cancel)(Main *bmain, wmDrag *drag, wmDropBox *drop), WMDropboxTooltipFunc tooltip)
void WM_drag_free_imported_drag_ID(Main *bmain, wmDrag *drag, wmDropBox *drop)
Free asset ID imported for canceled drop.
const char * WM_drag_get_item_name(wmDrag *drag)
bool WM_drag_is_ID_type(const wmDrag *drag, int idcode)
ID * WM_drag_get_local_ID_or_import_from_asset(const bContext *C, const wmDrag *drag, int idcode)
ListBase * WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
ID * WM_drag_get_local_ID(const wmDrag *drag, short idcode)
int xy[2]
Definition wm_draw.cc:170