63#include <fmt/format.h>
92 if (dm->spaceid == spaceid && dm->regionid == regionid) {
94 return &dm->dropboxes;
117 printf(
"Error: dropbox with unknown operator: %s\n", idname);
121 wmDropBox *drop = MEM_cnew<wmDropBox>(__func__);
154 if (drop->
ptr ==
nullptr) {
187 MEM_delete(drop->
ptr);
235 if (region->visible) {
238 area_region_tag[area->spacetype][region->regiontype] =
true;
245 if (!area_region_tag[dm->spaceid][dm->regionid]) {
263 wmDrag *drag = MEM_new<wmDrag>(__func__);
329 int event_xy_target[2];
353 return std::make_unique<bContextStore>(*but_context);
382 std::string *
str =
static_cast<std::string *
>(poin);
406 if (asset_item->is_external) {
451 if (!drop->
poll(C, drag, event)) {
468 bool free_disabled_info =
false;
515 if (event->
xy[0] < 0 || event->
xy[1] < 0 || event->
xy[0] > win_size[0] ||
516 event->
xy[1] > win_size[1])
528 if (drop != drop_prev) {
529 if (drop_prev && drop_prev->
on_exit) {
530 drop_prev->
on_exit(drop_prev, drag);
558 drop->
copy(C, drag, drop);
573 bool any_active =
false;
600 if (drag_id->id ==
id) {
601 if (drag_id->from_parent ==
nullptr) {
602 drag_id->from_parent = from_parent;
606 if (
GS(drag_id->id->name) !=
GS(id->name)) {
613 wmDragID *drag_id = MEM_cnew<wmDragID>(__func__);
630 ID *
id = drag_id->
id;
631 return (idcode == 0 ||
GS(id->name) == idcode) ?
id :
nullptr;
652 wmDragAsset *asset_drag = MEM_new<wmDragAsset>(__func__);
654 asset_drag->
asset = asset;
663 MEM_delete(*asset_data);
664 *asset_data =
nullptr;
676 return ELEM(idcode, 0, asset_idcode) ? asset_drag :
nullptr;
795 bmain, drop->
ptr, asset_id_type);
847 wmDragPath *path_data = MEM_new<wmDragPath>(
"wmDragPath");
849 for (
const char *path : paths) {
858 std::string path_count = std::to_string(path_data->
paths.
size());
859 path_data->
tooltip = fmt::format(
TIP_(
"Dragging {} files"), path_count);
867 MEM_delete(*path_data);
868 *path_data =
nullptr;
878 return path_data->
paths[0].c_str();
889 const auto *itr = std::find_if(
890 file_types.
begin(), file_types.
end(), [file_type](
const int file_fype_test) {
891 return file_fype_test & file_type;
894 if (itr == file_types.
end()) {
897 const int index = itr - file_types.
begin();
898 return path_data->
paths[index].c_str();
933 const std::string *
str =
static_cast<const std::string *
>(drag->
poin);
940 const std::string *
str =
static_cast<const std::string *
>(drag->
poin);
941 const size_t str_eol =
str->find(
'\n');
942 if (str_eol != std::string::npos) {
943 return str->substr(0, str_eol);
958 float col_fg[4], col_bg[4];
971 float col_fg[4], col_bg[4];
980 switch (drag->
type) {
999 return path_drag_data->
tooltip.c_str();
1002 return static_cast<const char *
>(drag->
poin);
1032 const float col[4] = {1.0f, 1.0f, 1.0f, 0.65f};
1053 const uchar text_col[] = {255, 255, 255, 255};
1062 const uchar text_col[] = {255, 255, 255, 255};
1087 if (tooltip.
is_empty() && !has_disabled_info) {
1097 x =
xy[0] - (icon_width / 2);
1099 if (
xy[1] + (icon_height / 2) +
padding + iconsize < winsize_y) {
1100 y =
xy[1] + (icon_height / 2) +
padding;
1109 if (
xy[1] + iconsize + iconsize < winsize_y) {
1120 else if (has_disabled_info) {
Main runtime representation of an asset.
void immDrawPixelsTexTiled_scaling(IMMDrawPixelsTexState *state, float x, float y, int img_w, int img_h, eGPUTextureFormat 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)
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)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void void BLI_INLINE bool BLI_listbase_is_single(const struct ListBase *lb)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
MINLINE int round_fl_to_int(float a)
void rgba_uchar_to_float(float r_col[4], const unsigned char col_ub[4])
#define STRNCPY(dst, 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
@ ASSET_IMPORT_APPEND_REUSE
struct AssetRepresentationHandle AssetRepresentationHandle
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)
GHOST C-API function and type declarations.
@ GPU_SHADER_3D_IMAGE_COLOR
void GPU_blend(eGPUBlend blend)
Contains defines and structs used throughout the imbuf module.
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)
#define UI_NO_ICON_OVERLAY_TEXT
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_GetThemeColor4fv(int colorid, float col[4])
@ WM_DRAG_GREASE_PENCIL_LAYER
std::string(*)(bContext *C, wmDrag *drag, const int xy[2], wmDropBox *drop) WMDropboxTooltipFunc
constexpr const T * end() const
constexpr const T * begin() const
constexpr bool is_empty() const
constexpr const char * c_str() const
void append(const T &value)
Span< T > as_span() const
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
RAYTRACE_GROUP_SIZE additional_info("eevee_shared", "eevee_gbuffer_data", "eevee_global_ubo", "eevee_sampling_data", "eevee_utility_texture", "eevee_hiz_data", "draw_view") .specialization_constant(Type RAYTRACE_GROUP_SIZE in_sh_0_tx in_sh_2_tx screen_normal_tx GPU_RGBA8
void MEM_freeN(void *vmemh)
static void copy(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node)
struct AssetMetaData * asset_data
ImBufByteBuffer byte_buffer
uiWidgetColors wcol_tooltip
const char * disabled_info
std::unique_ptr< bContextStore > ui_context
wmDropBox * active_dropbox
wmDragAsset * external_info
union wmDragAssetListItem::@1405 asset_data
const AssetRepresentationHandle * asset
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)
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)
static void wm_drop_update_active(bContext *C, wmDrag *drag, const wmEvent *event)
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)
wmDragAsset * WM_drag_create_asset_data(const blender::asset_system::AssetRepresentation *asset, int import_method)
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)
Free asset ID imported for canceled 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)
wmOperatorCallContext wm_drop_operator_context_get(const wmDropBox *)
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)
ID * WM_drag_get_local_ID_or_import_from_asset(const bContext *C, const wmDrag *drag, int idcode)
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)
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)
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, short 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)