Blender  V3.3
Classes | Functions | Variables
wm_dragdrop.cc File Reference
#include <cstring>
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
#include "MEM_guardedalloc.h"
#include "BLT_translation.h"
#include "BLI_bitmap.h"
#include "BLI_blenlib.h"
#include "BLI_math_color.h"
#include "BIF_glutil.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_idtype.h"
#include "BKE_lib_id.h"
#include "BKE_main.h"
#include "BKE_screen.h"
#include "GHOST_C-api.h"
#include "BLO_readfile.h"
#include "ED_asset.h"
#include "ED_screen.h"
#include "GPU_shader.h"
#include "GPU_state.h"
#include "GPU_viewport.h"
#include "IMB_imbuf_types.h"
#include "UI_interface.h"
#include "UI_interface_icons.h"
#include "UI_resources.h"
#include "RNA_access.h"
#include "WM_api.h"
#include "WM_types.h"
#include "wm_event_system.h"
#include "wm_window.h"

Go to the source code of this file.

Classes

struct  wmDropBoxMap
 

Functions

static void wm_drag_free_asset_data (wmDragAsset **asset_data)
 
ListBase * WM_dropboxmap_find (const char *idname, int spaceid, int regionid)
 
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)
 
void wm_dropbox_free (void)
 
static void wm_dropbox_invoke (bContext *C, wmDrag *drag)
 
wmDrag * WM_drag_data_create (bContext *C, int icon, int type, void *poin, double value, unsigned int flags)
 
void WM_event_start_prepared_drag (bContext *C, wmDrag *drag)
 
void WM_event_start_drag (bContext *C, int icon, int type, void *poin, double value, unsigned int flags)
 
void wm_drags_exit (wmWindowManager *wm, wmWindow *win)
 
static bContextStore * wm_drop_ui_context_create (const bContext *C)
 
static void wm_drop_ui_context_free (bContextStore **context_store)
 
void WM_event_drag_image (wmDrag *drag, ImBuf *imb, float scale)
 
void WM_drag_data_free (int dragtype, void *poin)
 
void WM_drag_free (wmDrag *drag)
 
void WM_drag_free_list (ListBase *lb)
 
static char * dropbox_tooltip (bContext *C, wmDrag *drag, const int xy[2], wmDropBox *drop)
 
static wmDropBox * dropbox_active (bContext *C, ListBase *handlers, wmDrag *drag, const wmEvent *event)
 
static wmDropBox * wm_dropbox_active (bContext *C, wmDrag *drag, const wmEvent *event)
 
static void wm_drop_update_active (bContext *C, wmDrag *drag, const wmEvent *event)
 
void wm_drop_prepare (bContext *C, wmDrag *drag, wmDropBox *drop)
 
void wm_drop_end (bContext *C, wmDrag *UNUSED(drag), wmDropBox *UNUSED(drop))
 
void wm_drags_check_ops (bContext *C, const wmEvent *event)
 
wmOperatorCallContext wm_drop_operator_context_get (const wmDropBox *UNUSED(drop))
 
void WM_drag_add_local_ID (wmDrag *drag, ID *id, ID *from_parent)
 
ID * WM_drag_get_local_ID (const wmDrag *drag, short idcode)
 
ID * WM_drag_get_local_ID_from_event (const wmEvent *event, short idcode)
 
bool WM_drag_is_ID_type (const wmDrag *drag, int idcode)
 
wmDragAsset * WM_drag_create_asset_data (const AssetHandle *asset, AssetMetaData *metadata, const char *path, int import_type)
 
wmDragAsset * WM_drag_get_asset_data (const wmDrag *drag, int idcode)
 
AssetMetaData * WM_drag_get_asset_meta_data (const wmDrag *drag, int idcode)
 
ID * WM_drag_asset_id_import (wmDragAsset *asset_drag, const int flag_extra)
 
bool WM_drag_asset_will_import_linked (const wmDrag *drag)
 
ID * WM_drag_get_local_ID_or_import_from_asset (const wmDrag *drag, int idcode)
 
void WM_drag_free_imported_drag_ID (Main *bmain, wmDrag *drag, wmDropBox *drop)
 Free asset ID imported for canceled drop. More...
 
wmDragAssetCatalog * WM_drag_get_asset_catalog_data (const wmDrag *drag)
 
void WM_drag_add_asset_list_item (wmDrag *drag, const bContext *C, const AssetLibraryReference *asset_library_ref, const AssetHandle *asset)
 
const ListBase * WM_drag_asset_list_get (const wmDrag *drag)
 
static void wm_drop_operator_draw (const char *name, int x, int y)
 
static void wm_drop_redalert_draw (const char *redalert_str, int x, int y)
 
const char * WM_drag_get_item_name (wmDrag *drag)
 
static int wm_drag_imbuf_icon_width_get (const wmDrag *drag)
 
static int wm_drag_imbuf_icon_height_get (const wmDrag *drag)
 
static void wm_drag_draw_icon (bContext *UNUSED(C), wmWindow *UNUSED(win), wmDrag *drag, const int xy[2])
 
static void wm_drag_draw_item_name (wmDrag *drag, const int x, const int y)
 
void WM_drag_draw_item_name_fn (bContext *UNUSED(C), wmWindow *UNUSED(win), wmDrag *drag, const int xy[2])
 
static void wm_drag_draw_tooltip (bContext *C, wmWindow *win, wmDrag *drag, const int xy[2])
 
static void wm_drag_draw_default (bContext *C, wmWindow *win, wmDrag *drag, const int xy[2])
 
void WM_drag_draw_default_fn (bContext *C, wmWindow *win, wmDrag *drag, const int xy[2])
 
void wm_drags_draw (bContext *C, wmWindow *win)
 

Variables

static ListBase dropboxes = {nullptr, nullptr}
 

Detailed Description

Our own drag-and-drop, drag state and drop boxes.

Definition in file wm_dragdrop.cc.

Function Documentation

◆ dropbox_active()

static wmDropBox* dropbox_active ( bContext *  C,
ListBase *  handlers,
wmDrag *  drag,
const wmEvent *  event 
)
static

◆ dropbox_tooltip()

static char* dropbox_tooltip ( bContext *  C,
wmDrag *  drag,
const int  xy[2],
wmDropBox *  drop 
)
static

◆ WM_drag_add_asset_list_item()

void WM_drag_add_asset_list_item ( wmDrag *  drag,
const bContext *  C,
const AssetLibraryReference *  asset_library_ref,
const AssetHandle *  asset 
)

◆ WM_drag_add_local_ID()

void WM_drag_add_local_ID ( wmDrag *  drag,
ID *  id,
ID *  from_parent 
)

◆ WM_drag_asset_id_import()

ID* WM_drag_asset_id_import ( wmDragAsset *  asset_drag,
int  flag_extra 
)

◆ WM_drag_asset_list_get()

const ListBase* WM_drag_asset_list_get ( const wmDrag *  drag)

◆ WM_drag_asset_will_import_linked()

bool WM_drag_asset_will_import_linked ( const wmDrag *  drag)

◆ WM_drag_create_asset_data()

wmDragAsset* WM_drag_create_asset_data ( const AssetHandle *  asset,
AssetMetaData *  metadata,
const char *  path,
int  import_type 
)

◆ WM_drag_data_create()

wmDrag* WM_drag_data_create ( struct bContext *  C,
int  icon,
int  type,
void *  poin,
double  value,
unsigned int  flags 
)

Create and fill the dragging data, but don't start dragging just yet (unlike WM_event_start_drag()). Must be followed up by WM_event_start_prepared_drag(), otherwise the returned pointer will leak memory.

Note that poin should be valid allocated and not on stack.

Definition at line 177 of file wm_dragdrop.cc.

References BLI_freelistN(), BLI_strncpy(), C, CTX_data_collection_get(), CTX_wm_asset_library_ref(), FILE_MAX, wmDrag::flags, wmDrag::icon, LISTBASE_FOREACH, MEM_freeN, wmDrag::path, wmDrag::poin, type, wmDrag::type, wmDrag::value, WM_drag_add_asset_list_item(), WM_drag_add_local_ID(), WM_DRAG_ASSET, WM_DRAG_ASSET_CATALOG, WM_DRAG_ASSET_LIST, WM_DRAG_FREE_DATA, WM_DRAG_ID, and WM_DRAG_PATH.

Referenced by outliner_item_drag_drop_invoke(), ui_but_drag_start(), and WM_event_start_drag().

◆ WM_drag_data_free()

void WM_drag_data_free ( int  dragtype,
void *  poin 
)

◆ wm_drag_draw_default()

static void wm_drag_draw_default ( bContext *  C,
wmWindow *  win,
wmDrag *  drag,
const int  xy[2] 
)
static

◆ WM_drag_draw_default_fn()

void WM_drag_draw_default_fn ( bContext *  C,
wmWindow *  win,
wmDrag *  drag,
const int  xy[2] 
)

Definition at line 961 of file wm_dragdrop.cc.

References C, wm_drag_draw_default(), and xy.

◆ wm_drag_draw_icon()

static void wm_drag_draw_icon ( bContext *  UNUSEDC,
wmWindow *  UNUSEDwin,
wmDrag *  drag,
const int  xy[2] 
)
static

◆ wm_drag_draw_item_name()

static void wm_drag_draw_item_name ( wmDrag *  drag,
const int  x,
const int  y 
)
static

◆ WM_drag_draw_item_name_fn()

void WM_drag_draw_item_name_fn ( bContext *  UNUSEDC,
wmWindow *  UNUSEDwin,
wmDrag *  drag,
const int  xy[2] 
)

Definition at line 872 of file wm_dragdrop.cc.

References UI_DPI_FAC, wm_drag_draw_item_name(), x, xy, and y.

Referenced by view3d_dropboxes().

◆ wm_drag_draw_tooltip()

static void wm_drag_draw_tooltip ( bContext *  C,
wmWindow *  win,
wmDrag *  drag,
const int  xy[2] 
)
static

◆ WM_drag_free()

void WM_drag_free ( wmDrag *  drag)

◆ wm_drag_free_asset_data()

static void wm_drag_free_asset_data ( wmDragAsset **  asset_data)
static

Definition at line 577 of file wm_dragdrop.cc.

References MEM_freeN, and MEM_SAFE_FREE.

Referenced by WM_drag_data_free(), and WM_drag_free().

◆ WM_drag_free_imported_drag_ID()

void WM_drag_free_imported_drag_ID ( struct Main *  bmain,
struct wmDrag *  drag,
struct wmDropBox *  drop 
)

Free asset ID imported for canceled drop.

If the asset was imported (linked/appended) using WM_drag_get_local_ID_or_import_from_asset()` (typically via a wmDropBox.copy() callback), we want the ID to be removed again if the drop operator cancels. This is for use as wmDropBox.cancel() callback.

Definition at line 686 of file wm_dragdrop.cc.

References BKE_id_free_us(), wmDragAsset::id_type, id_us_plus(), wmDropBox::ptr, wmDrag::type, WM_DRAG_ASSET, WM_drag_get_asset_data(), and WM_operator_properties_id_lookup_from_name_or_session_uuid().

Referenced by ED_dropboxes_ui(), blender::ed::space_node::node_dropboxes(), and view3d_dropboxes().

◆ WM_drag_free_list()

void WM_drag_free_list ( ListBase *  lb)

◆ WM_drag_get_asset_catalog_data()

wmDragAssetCatalog* WM_drag_get_asset_catalog_data ( const wmDrag *  drag)

◆ WM_drag_get_asset_data()

wmDragAsset* WM_drag_get_asset_data ( const wmDrag *  drag,
int  idcode 
)

◆ WM_drag_get_asset_meta_data()

AssetMetaData* WM_drag_get_asset_meta_data ( const wmDrag *  drag,
int  idcode 
)

◆ WM_drag_get_item_name()

const char* WM_drag_get_item_name ( wmDrag *  drag)

◆ WM_drag_get_local_ID()

ID* WM_drag_get_local_ID ( const wmDrag *  drag,
short  idcode 
)

◆ WM_drag_get_local_ID_from_event()

ID* WM_drag_get_local_ID_from_event ( const wmEvent *  event,
short  idcode 
)

◆ WM_drag_get_local_ID_or_import_from_asset()

ID* WM_drag_get_local_ID_or_import_from_asset ( const wmDrag *  drag,
int  idcode 
)

◆ wm_drag_imbuf_icon_height_get()

static int wm_drag_imbuf_icon_height_get ( const wmDrag *  drag)
static

◆ wm_drag_imbuf_icon_width_get()

static int wm_drag_imbuf_icon_width_get ( const wmDrag *  drag)
static

◆ WM_drag_is_ID_type()

bool WM_drag_is_ID_type ( const wmDrag *  drag,
int  idcode 
)

◆ wm_drags_check_ops()

void wm_drags_check_ops ( bContext *  C,
const wmEvent *  event 
)

◆ wm_drags_draw()

void wm_drags_draw ( bContext *  C,
wmWindow *  win 
)

◆ wm_drags_exit()

void wm_drags_exit ( wmWindowManager *  wm,
wmWindow *  win 
)

Additional work to cleanly end dragging. Additional because this doesn't actually remove the drag items. Should be called whenever dragging is stopped (successful or not, also when canceled).

Definition at line 244 of file wm_dragdrop.cc.

References wmWindowManager::drags, LISTBASE_FOREACH, wmWindow::tag_cursor_refresh, WM_cursor_modal_restore(), and WM_event_add_mousemove().

Referenced by wm_drop_prepare(), wm_event_drag_and_drop_test(), and wm_handlers_do_intern().

◆ wm_drop_end()

void wm_drop_end ( bContext *  C,
wmDrag *  UNUSEDdrag,
wmDropBox *  UNUSEDdrop 
)

Definition at line 476 of file wm_dragdrop.cc.

References C, and CTX_store_set().

Referenced by wm_handlers_do_intern().

◆ wm_drop_operator_context_get()

wmOperatorCallContext wm_drop_operator_context_get ( const wmDropBox *  UNUSEDdrop)

Definition at line 501 of file wm_dragdrop.cc.

References WM_OP_INVOKE_DEFAULT.

Referenced by dropbox_active(), wm_drop_prepare(), and wm_handlers_do_intern().

◆ wm_drop_operator_draw()

static void wm_drop_operator_draw ( const char *  name,
int  x,
int  y 
)
static

◆ wm_drop_prepare()

void wm_drop_prepare ( bContext *  C,
wmDrag *  drag,
wmDropBox *  drop 
)

◆ wm_drop_redalert_draw()

static void wm_drop_redalert_draw ( const char *  redalert_str,
int  x,
int  y 
)
static

◆ wm_drop_ui_context_create()

static bContextStore* wm_drop_ui_context_create ( const bContext *  C)
static

◆ wm_drop_ui_context_free()

static void wm_drop_ui_context_free ( bContextStore **  context_store)
static

Definition at line 279 of file wm_dragdrop.cc.

References CTX_store_free().

Referenced by WM_drag_free(), and wm_drop_update_active().

◆ wm_drop_update_active()

static void wm_drop_update_active ( bContext *  C,
wmDrag *  drag,
const wmEvent *  event 
)
static

◆ wm_dropbox_active()

static wmDropBox* wm_dropbox_active ( bContext *  C,
wmDrag *  drag,
const wmEvent *  event 
)
static

◆ WM_dropbox_add()

wmDropBox* WM_dropbox_add ( ListBase *  lb,
const char *  idname,
bool(*)(bContext *, wmDrag *, const wmEvent *)  poll,
void(*)(bContext *, wmDrag *, wmDropBox *)  copy,
void(*)(Main *, wmDrag *, wmDropBox *)  cancel,
WMDropboxTooltipFunc  tooltip 
)

◆ wm_dropbox_free()

void wm_dropbox_free ( void  )

Definition at line 121 of file wm_dragdrop.cc.

References BLI_freelistN(), dropboxes, LISTBASE_FOREACH, MEM_freeN, and WM_operator_properties_free().

Referenced by WM_exit_ex().

◆ wm_dropbox_invoke()

static void wm_dropbox_invoke ( bContext *  C,
wmDrag *  drag 
)
static

◆ WM_dropboxmap_find()

ListBase* WM_dropboxmap_find ( const char *  idname,
int  spaceid,
int  regionid 
)

◆ WM_event_drag_image()

void WM_event_drag_image ( wmDrag *  drag,
ImBuf *  imb,
float  scale 
)

Definition at line 288 of file wm_dragdrop.cc.

References wmDrag::imb, and wmDrag::imbuf_scale.

Referenced by ui_but_drag_start().

◆ WM_event_start_drag()

void WM_event_start_drag ( struct bContext *  C,
int  icon,
int  type,
void *  poin,
double  value,
unsigned int  flags 
)

Start dragging immediately with the given data. Note that poin should be valid allocated and not on stack.

Definition at line 237 of file wm_dragdrop.cc.

References C, type, WM_drag_data_create(), and WM_event_start_prepared_drag().

Referenced by blender::ui::ViewItemAPIWrapper::drag_start(), ghost_event_proc(), ui_but_drag_init(), and ui_but_drag_start().

◆ WM_event_start_prepared_drag()

void WM_event_start_prepared_drag ( struct bContext *  C,
wmDrag *  drag 
)

Invoke dragging using the given drag data.

Definition at line 229 of file wm_dragdrop.cc.

References BLI_addtail(), C, CTX_wm_manager(), wmWindowManager::drags, and wm_dropbox_invoke().

Referenced by outliner_item_drag_drop_invoke(), ui_but_drag_start(), and WM_event_start_drag().

Variable Documentation

◆ dropboxes

ListBase dropboxes = {nullptr, nullptr}
static