65#include <fmt/format.h>
94 if (dm->spaceid == spaceid && dm->regionid == regionid) {
96 return &dm->dropboxes;
119 printf(
"Error: dropbox with unknown operator: %s\n", idname);
156 if (drop->
ptr ==
nullptr) {
189 MEM_delete(drop->
ptr);
237 if (region->runtime->visible) {
240 area_region_tag[area->spacetype][region->regiontype] =
true;
247 if (!area_region_tag[dm->spaceid][dm->regionid]) {
265 wmDrag *drag = MEM_new<wmDrag>(__func__);
331 int event_xy_target[2];
355 return std::make_unique<bContextStore>(*but_context);
374 for (
const std::string &path : selected_paths) {
375 paths.
append(path.c_str());
410 std::string *
str =
static_cast<std::string *
>(poin);
434 if (asset_item->is_external) {
479 if (!drop->
poll(
C, drag, event)) {
496 bool free_disabled_info =
false;
543 if (event->
xy[0] < 0 || event->
xy[1] < 0 || event->
xy[0] > win_size[0] ||
544 event->
xy[1] > win_size[1])
556 if (drop != drop_prev) {
557 if (drop_prev && drop_prev->
on_exit) {
558 drop_prev->
on_exit(drop_prev, drag);
586 drop->
copy(
C, drag, drop);
601 bool any_active =
false;
628 if (drag_id->id ==
id) {
629 if (drag_id->from_parent ==
nullptr) {
630 drag_id->from_parent = from_parent;
634 if (
GS(drag_id->id->name) !=
GS(id->
name)) {
658 ID *
id = drag_id->
id;
659 return (idcode == 0 ||
GS(id->
name) == idcode) ? id :
nullptr;
680 wmDragAsset *asset_drag = MEM_new<wmDragAsset>(__func__);
682 asset_drag->
asset = asset;
691 MEM_delete(*asset_data);
692 *asset_data =
nullptr;
704 return ELEM(idcode, 0, asset_idcode) ? asset_drag :
nullptr;
847 bmain, drop->
ptr, asset_id_type);
904 wmDragPath *path_data = MEM_new<wmDragPath>(
"wmDragPath");
906 for (
const char *path : paths) {
916 std::string path_count = std::to_string(path_data->
paths.
size());
917 path_data->
tooltip = fmt::format(fmt::runtime(
TIP_(
"Dragging {} files")), path_count);
925 MEM_delete(*path_data);
926 *path_data =
nullptr;
936 return path_data->
paths[0].c_str();
947 const auto *itr = std::find_if(
948 file_types.
begin(), file_types.
end(), [file_type](
const int file_fype_test) {
949 return file_fype_test & file_type;
952 if (itr == file_types.
end()) {
955 const int index = itr - file_types.
begin();
956 return path_data->
paths[index].c_str();
991 const std::string *
str =
static_cast<const std::string *
>(drag->
poin);
998 const std::string *
str =
static_cast<const std::string *
>(drag->
poin);
999 const size_t str_eol =
str->find(
'\n');
1000 if (str_eol != std::string::npos) {
1001 return str->substr(0, str_eol);
1016 float col_fg[4], col_bg[4];
1029 float col_fg[4], col_bg[4];
1038 switch (drag->
type) {
1044 return id->name + 2;
1057 return path_drag_data->
tooltip.c_str();
1060 return static_cast<const char *
>(drag->
poin);
1089 x =
xy[0] - int(8.0f * scale);
1090 y =
xy[1] - int(scale);
1091 const uchar text_col[] = {255, 255, 255, 255};
1095 x,
y, ICON_DOCUMENTS, 1.0f / scale, 1.0f, 0.0f, text_col,
false, &text_overlay);
1097 else if (drag->
imb) {
1106 const float col[4] = {1.0f, 1.0f, 1.0f, 0.65f};
1113 blender::gpu::TextureFormat::UNORM_8_8_8_8,
1134 const uchar text_col[] = {255, 255, 255, 255};
1143 const uchar text_col[] = {255, 255, 255, 255};
1168 if (tooltip.
is_empty() && !has_disabled_info) {
1178 x =
xy[0] - (icon_width / 2);
1180 if (
xy[1] + (icon_height / 2) +
padding + iconsize < winsize_y) {
1190 if (
xy[1] + 2 * 1.15 * iconsize < winsize_y) {
1212 if (
xy[1] + iconsize + iconsize < winsize_y) {
1223 else if (has_disabled_info) {
1244 xy_tmp[0] =
xy[0] - (preview_size / 2);
1245 xy_tmp[1] =
xy[1] - (preview_size / 2) - icon_size;
Main runtime representation of an asset.
void immDrawPixelsTexTiled_scaling(IMMDrawPixelsTexState *state, float x, float y, int img_w, int img_h, blender::gpu::TextureFormat gpu_format, bool use_filter, const void *rect, float scaleX, float scaleY, float xzoom, float yzoom, const float color[4])
IMMDrawPixelsTexState immDrawPixelsTexSetup(int builtin)
blender::Vector< PointerRNA > CTX_data_collection_get(const bContext *C, const char *member)
bScreen * CTX_wm_screen(const bContext *C)
SpaceFile * CTX_wm_space_file(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
const char * CTX_wm_operator_poll_msg_get(bContext *C, bool *r_free)
void CTX_store_set(bContext *C, const bContextStore *store)
void CTX_wm_area_set(bContext *C, ScrArea *area)
void CTX_wm_region_set(bContext *C, ARegion *region)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
void IDP_FreeProperty(IDProperty *prop)
const char * BKE_idtype_idcode_to_name_plural(short idcode)
void BKE_id_free_us(Main *bmain, void *idv) ATTR_NONNULL()
ARegion * BKE_area_find_region_xy(const ScrArea *area, int regiontype, const int xy[2]) ATTR_NONNULL(3)
ScrArea ScrArea * BKE_screen_find_area_xy(const bScreen *screen, int spacetype, const int xy[2]) ATTR_NONNULL(1
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
void void BLI_INLINE bool BLI_listbase_is_single(const ListBase *lb)
MINLINE int round_fl_to_int(float a)
MINLINE void rgba_uchar_to_float(float r_col[4], const unsigned char col_ub[4])
char * STRNCPY(char(&dst)[N], const char *src)
#define STRNCPY_UTF8(dst, src)
#define STREQLEN(a, b, n)
external readfile function prototypes.
@ BLO_LIBLINK_APPEND_RECURSIVE
@ BLO_LIBLINK_APPEND_ASSET_DATA_CLEAR
@ BLO_LIBLINK_APPEND_LOCAL_ID_REUSE
@ BLO_LIBLINK_COLLECTION_INSTANCE
@ ASSET_IMPORT_APPEND_REUSE
struct AssetRepresentationHandle AssetRepresentationHandle
blender::Vector< std::string > ED_fileselect_selected_files_full_paths(const SpaceFile *sfile)
int ED_path_extension_type(const char *path)
ARegion * ED_area_find_region_xy_visual(const ScrArea *area, int regiontype, const int event_xy[2])
#define ED_screen_areas_iter(win, screen, area_name)
void ED_region_tag_redraw_no_rebuild(ARegion *region)
@ GPU_SHADER_3D_IMAGE_COLOR
void GPU_blend(GPUBlend blend)
Read Guarded memory(de)allocation.
void UI_fontstyle_draw_simple(const uiFontStyle *fs, float x, float y, const char *str, const uchar col[4])
uiBut * UI_region_active_but_get(const ARegion *region)
void UI_fontstyle_draw_simple_backdrop(const uiFontStyle *fs, float x, float y, blender::StringRef str, const float col_fg[4], const float col_bg[4])
const bContextStore * UI_but_context_get(const uiBut *but)
void UI_icon_text_overlay_init_from_count(IconTextOverlay *text_overlay, const int icon_indicator_number)
#define UI_NO_ICON_OVERLAY_TEXT
#define PREVIEW_DRAG_DRAW_SIZE
void UI_icon_draw_ex(float x, float y, int icon_id, float aspect, float alpha, float desaturate, const uchar mono_color[4], bool mono_border, const IconTextOverlay *text_overlay, const bool inverted=false)
void UI_icon_draw_preview(float x, float y, int icon_id, float aspect, float alpha, int size)
void UI_GetThemeColor4fv(int colorid, float col[4])
std::string(*)(bContext *C, wmDrag *drag, const int xy[2], wmDropBox *drop) WMDropboxTooltipFunc
@ WM_DRAG_GREASE_PENCIL_LAYER
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void append(const T &value)
Span< T > as_span() const
constexpr const T * end() const
constexpr const T * begin() const
constexpr bool is_empty() const
constexpr bool is_empty() const
constexpr const char * c_str() const
void append(const T &value)
AssetMetaData & get_metadata() const
ID_Type get_id_type() const
std::string full_library_path() const
bool get_use_relative_path() const
StringRefNull get_name() const
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
VecBase< int32_t, 2 > int2
static void copy(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node)
ARegionRuntimeHandle * runtime
bool use_instance_collections
eAssetImportMethod method
struct AssetMetaData * asset_data
ImBufByteBuffer byte_buffer
uiWidgetColors wcol_tooltip
struct ARegion * active_region
const char * disabled_info
std::unique_ptr< bContextStore > ui_context
wmDropBox * active_dropbox
wmDragAsset * external_info
union wmDragAssetListItem::@356367110101130017201161164010115362272120017131 asset_data
const AssetRepresentationHandle * asset
AssetImportSettings import_settings
blender::Vector< int > file_types
blender::Vector< std::string > paths
wmDragActiveDropState drop_state
char idname[KMAP_MAX_NAME]
WMDropboxTooltipFunc tooltip
bool(* poll)(bContext *C, wmDrag *drag, const wmEvent *event)
void(* on_drag_start)(bContext *C, wmDrag *drag)
void(* on_exit)(wmDropBox *drop, wmDrag *drag)
void(* on_enter)(wmDropBox *drop, wmDrag *drag)
void(* cancel)(Main *bmain, wmDrag *drag, wmDropBox *drop)
void(* draw_in_view)(bContext *C, wmWindow *win, wmDrag *drag, const int xy[2])
void(* draw_droptip)(bContext *C, wmWindow *win, wmDrag *drag, const int xy[2])
void(* copy)(bContext *C, wmDrag *drag, wmDropBox *drop)
WindowManagerRuntimeHandle * runtime
struct wmEvent * eventstate
void WM_cursor_modal_set(wmWindow *win, int val)
void WM_cursor_modal_restore(wmWindow *win)
static void wm_drop_item_clear_runtime(wmDropBox *drop)
AssetMetaData * WM_drag_get_asset_meta_data(const wmDrag *drag, int idcode)
wmDragAsset * WM_drag_create_asset_data(const blender::asset_system::AssetRepresentation *asset, const AssetImportSettings &import_settings)
static void wm_drop_update_active(bContext *C, wmDrag *drag, const wmEvent *event)
static int wm_drag_preview_icon_size_get()
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_drop_prepare(bContext *C, wmDrag *drag, wmDropBox *drop)
void WM_drag_draw_item_name_fn(bContext *, wmWindow *win, wmDrag *drag, const int xy[2])
static void wm_drag_draw_icon(bContext *, wmWindow *, wmDrag *drag, const int xy[2])
static void wm_drag_free_asset_data(wmDragAsset **asset_data)
static void wm_drop_operator_draw(const blender::StringRef name, int x, int y)
static void wm_drop_redalert_draw(const blender::StringRef redalert_str, int x, int y)
void WM_drag_free_imported_drag_ID(Main *bmain, wmDrag *drag, wmDropBox *drop)
static void wm_dropbox_item_update_ot(wmDropBox *drop)
static std::string dropbox_tooltip(bContext *C, wmDrag *drag, const int xy[2], wmDropBox *drop)
bool WM_drag_asset_will_import_linked(const wmDrag *drag)
ID * WM_drag_asset_id_import(const bContext *C, wmDragAsset *asset_drag, const int flag_extra)
static void wm_drag_draw_tooltip(bContext *C, wmWindow *win, wmDrag *drag, const int xy[2])
static wmDropBox * dropbox_active(bContext *C, ListBase *handlers, wmDrag *drag, const wmEvent *event)
static void wm_drag_draw_default(bContext *C, wmWindow *win, wmDrag *drag, const int xy[2])
wmDragPath * WM_drag_create_path_data(blender::Span< const char * > paths)
void WM_event_start_drag(bContext *C, int icon, eWM_DragDataType type, void *poin, uint flags)
const char * WM_drag_get_item_name(wmDrag *drag)
void wm_drags_draw(bContext *C, wmWindow *win)
void WM_drag_add_asset_list_item(wmDrag *drag, const blender::asset_system::AssetRepresentation *asset)
Free asset ID imported for canceled drop.
void WM_drag_free(wmDrag *drag)
void WM_event_start_prepared_drag(bContext *C, wmDrag *drag)
const std::string & WM_drag_get_string(const wmDrag *drag)
blender::Span< std::string > WM_drag_get_paths(const wmDrag *drag)
void wm_drop_end(bContext *C, wmDrag *, wmDropBox *)
wmDragAssetCatalog * WM_drag_get_asset_catalog_data(const wmDrag *drag)
void wm_drags_check_ops(bContext *C, const wmEvent *event)
void WM_drag_draw_default_fn(bContext *C, wmWindow *win, wmDrag *drag, const int xy[2])
int WM_drag_get_path_file_type(const wmDrag *drag)
bool WM_drag_is_ID_type(const wmDrag *drag, int idcode)
const char * WM_drag_get_single_path(const wmDrag *drag)
void WM_event_drag_path_override_poin_data_with_space_file_paths(const bContext *C, wmDrag *drag)
ID * WM_drag_get_local_ID_or_import_from_asset(const bContext *C, const wmDrag *drag, int idcode)
bool WM_drag_asset_will_import_packed(const wmDrag *drag)
static int wm_drag_imbuf_icon_height_get(const wmDrag *drag)
wmDrag * WM_drag_data_create(bContext *C, int icon, eWM_DragDataType type, void *poin, uint flags)
void WM_dropbox_update_ot()
static wmDropBox * wm_dropbox_active(bContext *C, wmDrag *drag, const wmEvent *event)
ID * WM_drag_get_local_ID_from_event(const wmEvent *event, short idcode)
void wm_drags_exit(wmWindowManager *wm, wmWindow *win)
void WM_event_drag_image(wmDrag *drag, const ImBuf *imb, float scale)
ListBase * WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
static void wm_dropbox_invoke(bContext *C, wmDrag *drag)
void WM_event_drag_preview_icon(wmDrag *drag, int icon_id)
static void wm_drop_item_free_data(wmDropBox *drop)
std::string WM_drag_get_string_firstline(const wmDrag *drag)
void WM_drag_data_free(eWM_DragDataType dragtype, void *poin)
void WM_drag_free_list(ListBase *lb)
wmDragAsset * WM_drag_get_asset_data(const wmDrag *drag, int idcode)
blender::wm::OpCallContext wm_drop_operator_context_get(const wmDropBox *)
static ListBase dropboxes
void WM_drag_add_local_ID(wmDrag *drag, ID *id, ID *from_parent)
static std::unique_ptr< bContextStore > wm_drop_ui_context_create(const bContext *C)
static void wm_drag_draw_item_name(wmDrag *drag, const int x, const int y)
const ListBase * WM_drag_asset_list_get(const wmDrag *drag)
static int wm_drag_imbuf_icon_width_get(const wmDrag *drag)
static void wm_drag_free_path_data(wmDragPath **path_data)
bool WM_drag_has_path_file_type(const wmDrag *drag, int file_type)
ID * WM_drag_get_local_ID(const wmDrag *drag, short idcode)
bool WM_operator_poll_context(bContext *C, wmOperatorType *ot, blender::wm::OpCallContext context)
void WM_event_add_mousemove(wmWindow *win)
@ WM_HANDLER_TYPE_DROPBOX
ID * WM_file_append_datablock(Main *bmain, Scene *scene, ViewLayer *view_layer, View3D *v3d, const char *filepath, const short id_code, const char *id_name, int flag)
ID * WM_file_link_datablock(Main *bmain, Scene *scene, ViewLayer *view_layer, View3D *v3d, const char *filepath, const short id_code, const char *id_name, int flag)
ID * WM_operator_properties_id_lookup_from_name_or_session_uid(Main *bmain, PointerRNA *ptr, const ID_Type type)
std::string WM_operatortype_name(wmOperatorType *ot, PointerRNA *properties)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
void WM_operator_properties_alloc(PointerRNA **ptr, IDProperty **properties, const char *opstring)
void WM_operator_properties_create_ptr(PointerRNA *ptr, wmOperatorType *ot)
void WM_operator_properties_free(PointerRNA *ptr)
void WM_operator_properties_sanitize(PointerRNA *ptr, const bool no_context)
void wmViewport(const rcti *winrct)
void wmWindowViewport(const wmWindow *win)
void wmWindowViewport_ex(const wmWindow *win, float offset)
blender::int2 WM_window_native_pixel_size(const wmWindow *win)
bool wm_cursor_position_get(wmWindow *win, int *r_x, int *r_y)
int WM_window_native_pixel_y(const wmWindow *win)
wmWindow * WM_window_find_under_cursor(wmWindow *win, const int event_xy[2], int r_event_xy_other[2])
bScreen * WM_window_get_active_screen(const wmWindow *win)