Cleanup: Add enum type for drag data type definitions

Adds type safety and enables compiler features like warnings on missing
enumerator in switches.
This commit is contained in:
Julian Eisel 2023-05-17 16:09:34 +02:00
parent aa2eb422a7
commit ac6af0be7b
7 changed files with 43 additions and 29 deletions

View File

@ -29,6 +29,8 @@
#include "UI_interface.hh"
#include "WM_types.h"
struct bContext;
struct uiBlock;
struct uiLayout;
@ -244,7 +246,7 @@ class AbstractViewItemDragController {
AbstractViewItemDragController(AbstractView &view);
virtual ~AbstractViewItemDragController() = default;
virtual int get_drag_type() const = 0;
virtual eWM_DragDataType get_drag_type() const = 0;
virtual void *create_drag_data() const = 0;
virtual void on_drag_start();

View File

@ -249,8 +249,7 @@ struct uiBut {
ListBase extra_op_icons = {nullptr, nullptr}; /** #uiButExtraOpIcon */
/* Drag-able data, type is WM_DRAG_... */
char dragtype = WM_DRAG_ID;
eWM_DragDataType dragtype = WM_DRAG_ID;
short dragflag = 0;
void *dragpoin = nullptr;
ImBuf *imb = nullptr;

View File

@ -103,7 +103,7 @@ class AssetCatalogDragController : public ui::AbstractViewItemDragController {
explicit AssetCatalogDragController(AssetCatalogTreeView &tree_view,
AssetCatalogTreeItem &catalog_item);
int get_drag_type() const override;
eWM_DragDataType get_drag_type() const override;
void *create_drag_data() const override;
void on_drag_start() override;
};
@ -545,7 +545,7 @@ AssetCatalogDragController::AssetCatalogDragController(AssetCatalogTreeView &tre
{
}
int AssetCatalogDragController::get_drag_type() const
eWM_DragDataType AssetCatalogDragController::get_drag_type() const
{
return WM_DRAG_ASSET_CATALOG;
}

View File

@ -1461,7 +1461,7 @@ static int outliner_item_drag_drop_invoke(bContext *C, wmOperator * /*op*/, cons
TSE_GPENCIL_EFFECT,
TSE_GPENCIL_EFFECT_BASE);
const int wm_drag_type = use_datastack_drag ? WM_DRAG_DATASTACK : WM_DRAG_ID;
const eWM_DragDataType wm_drag_type = use_datastack_drag ? WM_DRAG_DATASTACK : WM_DRAG_ID;
wmDrag *drag = WM_drag_data_create(C, data.icon, wm_drag_type, nullptr, 0.0, WM_DRAG_NOP);
if (use_datastack_drag) {

View File

@ -1360,8 +1360,12 @@ int WM_operator_flag_only_pass_through_on_press(int retval, const struct wmEvent
* Start dragging immediately with the given data.
* Note that \a poin should be valid allocated and not on stack.
*/
void WM_event_start_drag(
struct bContext *C, int icon, int type, void *poin, double value, unsigned int flags);
void WM_event_start_drag(struct bContext *C,
int icon,
eWM_DragDataType 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
@ -1369,15 +1373,19 @@ void WM_event_start_drag(
*
* Note that \a poin should be valid allocated and not on stack.
*/
wmDrag *WM_drag_data_create(
struct bContext *C, int icon, int type, void *poin, double value, unsigned int flags);
wmDrag *WM_drag_data_create(struct bContext *C,
int icon,
eWM_DragDataType type,
void *poin,
double value,
unsigned int flags);
/**
* Invoke dragging using the given \a drag data.
*/
void WM_event_start_prepared_drag(struct bContext *C, wmDrag *drag);
void WM_event_drag_image(struct wmDrag *, struct ImBuf *, float scale);
void WM_drag_free(struct wmDrag *drag);
void WM_drag_data_free(int dragtype, void *poin);
void WM_drag_data_free(eWM_DragDataType dragtype, void *poin);
void WM_drag_free_list(struct ListBase *lb);
struct wmDropBox *WM_dropbox_add(
ListBase *lb,

View File

@ -1062,19 +1062,21 @@ typedef void (*wmPaintCursorDraw)(struct bContext *C, int, int, void *customdata
/* *************** Drag and drop *************** */
#define WM_DRAG_ID 0
#define WM_DRAG_ASSET 1
/** The user is dragging multiple assets. This is only supported in few specific cases, proper
* multi-item support for dragging isn't supported well yet. Therefore this is kept separate from
* #WM_DRAG_ASSET. */
#define WM_DRAG_ASSET_LIST 2
#define WM_DRAG_RNA 3
#define WM_DRAG_PATH 4
#define WM_DRAG_NAME 5
#define WM_DRAG_VALUE 6
#define WM_DRAG_COLOR 7
#define WM_DRAG_DATASTACK 8
#define WM_DRAG_ASSET_CATALOG 9
typedef enum eWM_DragDataType {
WM_DRAG_ID,
WM_DRAG_ASSET,
/** The user is dragging multiple assets. This is only supported in few specific cases, proper
* multi-item support for dragging isn't supported well yet. Therefore this is kept separate from
* #WM_DRAG_ASSET. */
WM_DRAG_ASSET_LIST,
WM_DRAG_RNA,
WM_DRAG_PATH,
WM_DRAG_NAME,
WM_DRAG_VALUE,
WM_DRAG_COLOR,
WM_DRAG_DATASTACK,
WM_DRAG_ASSET_CATALOG,
} eWM_DragDataType;
typedef enum eWM_DragFlags {
WM_DRAG_NOP = 0,
@ -1174,8 +1176,7 @@ typedef struct wmDrag {
struct wmDrag *next, *prev;
int icon;
/** See 'WM_DRAG_' defines above. */
int type;
eWM_DragDataType type;
void *poin;
double value;

View File

@ -177,7 +177,8 @@ static void wm_dropbox_invoke(bContext *C, wmDrag *drag)
}
}
wmDrag *WM_drag_data_create(bContext *C, int icon, int type, void *poin, double value, uint flags)
wmDrag *WM_drag_data_create(
bContext *C, int icon, eWM_DragDataType type, void *poin, double value, uint flags)
{
wmDrag *drag = MEM_cnew<wmDrag>(__func__);
@ -232,7 +233,8 @@ void WM_event_start_prepared_drag(bContext *C, wmDrag *drag)
wm_dropbox_invoke(C, drag);
}
void WM_event_start_drag(bContext *C, int icon, int type, void *poin, double value, uint flags)
void WM_event_start_drag(
bContext *C, int icon, eWM_DragDataType type, void *poin, double value, uint flags)
{
wmDrag *drag = WM_drag_data_create(C, icon, type, poin, value, flags);
WM_event_start_prepared_drag(C, drag);
@ -288,7 +290,7 @@ void WM_event_drag_image(wmDrag *drag, ImBuf *imb, float scale)
drag->imbuf_scale = scale;
}
void WM_drag_data_free(int dragtype, void *poin)
void WM_drag_data_free(eWM_DragDataType dragtype, void *poin)
{
/* Don't require all the callers to have a nullptr-check, just allow passing nullptr. */
if (!poin) {
@ -849,6 +851,8 @@ const char *WM_drag_get_item_name(wmDrag *drag)
}
case WM_DRAG_NAME:
return static_cast<const char *>(drag->poin);
default:
break;
}
return "";
}