diff options
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 1 | ||||
-rw-r--r-- | source/blender/editors/interface/interface.c | 16 | ||||
-rw-r--r-- | source/blender/editors/space_file/file_draw.c | 5 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_dragdrop.c | 6 |
4 files changed, 24 insertions, 4 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 725c9921d13..065b0a2d057 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -773,6 +773,7 @@ void UI_block_translate(uiBlock *block, int x, int y); int UI_but_return_value_get(uiBut *but); void UI_but_drag_set_id(uiBut *but, struct ID *id); +void UI_but_drag_attach_image(uiBut *but, struct ImBuf *imb, const float scale); void UI_but_drag_set_asset(uiBut *but, const struct AssetHandle *asset, const char *path, diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 9f9324505ad..6ad0ef9de18 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -6239,6 +6239,16 @@ void UI_but_drag_set_id(uiBut *but, ID *id) } /** + * Set an image to display while dragging. This works for any drag type (`WM_DRAG_XXX`). + * Not to be confused with #UI_but_drag_set_image(), which sets up dragging of an image. + */ +void UI_but_drag_attach_image(uiBut *but, struct ImBuf *imb, const float scale) +{ + but->imb = imb; + but->imb_scale = scale; +} + +/** * \param asset: May be passed from a temporary variable, drag data only stores a copy of this. */ void UI_but_drag_set_asset(uiBut *but, @@ -6266,8 +6276,7 @@ void UI_but_drag_set_asset(uiBut *but, } but->dragpoin = asset_drag; but->dragflag |= UI_BUT_DRAGPOIN_FREE; - but->imb = imb; - but->imb_scale = scale; + UI_but_drag_attach_image(but, imb, scale); } void UI_but_drag_set_rna(uiBut *but, PointerRNA *ptr) @@ -6322,8 +6331,7 @@ void UI_but_drag_set_image( if (use_free) { but->dragflag |= UI_BUT_DRAGPOIN_FREE; } - but->imb = imb; - but->imb_scale = scale; + UI_but_drag_attach_image(but, imb, scale); } PointerRNA *UI_but_operator_ptr_get(uiBut *but) diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c index 66aabe39e44..e393cc41a86 100644 --- a/source/blender/editors/space_file/file_draw.c +++ b/source/blender/editors/space_file/file_draw.c @@ -178,6 +178,10 @@ static void file_draw_icon(const SpaceFile *sfile, if ((id = filelist_file_get_id(file))) { UI_but_drag_set_id(but, id); + ImBuf *preview_image = filelist_file_getimage(file); + if (preview_image) { + UI_but_drag_attach_image(but, preview_image, UI_DPI_FAC); + } } else if (sfile->browse_mode == FILE_BROWSE_MODE_ASSETS && (file->typeflag & FILE_TYPE_ASSET) != 0) { @@ -504,6 +508,7 @@ static void file_draw_preview(const SpaceFile *sfile, if ((id = filelist_file_get_id(file))) { UI_but_drag_set_id(but, id); + UI_but_drag_attach_image(but, imb, scale); } /* path is no more static, cannot give it directly to but... */ else if (sfile->browse_mode == FILE_BROWSE_MODE_ASSETS && diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c index 64aa55c058c..49b84abf9a2 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.c +++ b/source/blender/windowmanager/intern/wm_dragdrop.c @@ -767,6 +767,12 @@ static void wm_drag_draw_icon(bContext *UNUSED(C), const int xy[2]) { int x, y; + + /* This could also get the preview image of an ID when dragging one. But the big preview icon may + * actually not always be wanted, for example when dragging objects in the Outliner it gets in + * the way). So make the drag user set an image buffer explicitly (e.g. through + * #UI_but_drag_attach_image()). */ + if (drag->imb) { x = xy[0] - drag->sx / 2; y = xy[1] - drag->sy / 2; |