diff options
Diffstat (limited to 'source/blender/windowmanager/intern/wm_dragdrop.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_dragdrop.c | 87 |
1 files changed, 47 insertions, 40 deletions
diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c index db72dd2a819..76bb93b681c 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.c +++ b/source/blender/windowmanager/intern/wm_dragdrop.c @@ -96,14 +96,16 @@ 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 *, const char **), + bool (*poll)(bContext *, wmDrag *, const wmEvent *), void (*copy)(wmDrag *, wmDropBox *), - void (*cancel)(struct Main *, wmDrag *, wmDropBox *)) + void (*cancel)(struct Main *, wmDrag *, wmDropBox *), + WMDropboxTooltipFunc tooltip) { wmDropBox *drop = MEM_callocN(sizeof(wmDropBox), "wmDropBox"); drop->poll = poll; drop->copy = copy; drop->cancel = cancel; + drop->tooltip = tooltip; drop->ot = WM_operatortype_find(idname, 0); drop->opcontext = WM_OP_INVOKE_DEFAULT; @@ -218,22 +220,33 @@ void WM_drag_free_list(struct ListBase *lb) } } -static const char *dropbox_active(bContext *C, - ListBase *handlers, - wmDrag *drag, - const wmEvent *event) +static char *dropbox_tooltip(bContext *C, wmDrag *drag, const wmEvent *event, wmDropBox *drop) +{ + char *tooltip = NULL; + if (drop->tooltip) { + tooltip = drop->tooltip(C, drag, event, drop); + } + if (!tooltip) { + tooltip = BLI_strdup(WM_operatortype_name(drop->ot, drop->ptr)); + } + /* XXX Doing translation here might not be ideal, but later we have no more + * access to ot (and hence op context)... */ + return tooltip; +} + +static wmDropBox *dropbox_active(bContext *C, + ListBase *handlers, + wmDrag *drag, + const wmEvent *event) { LISTBASE_FOREACH (wmEventHandler *, handler_base, handlers) { if (handler_base->type == WM_HANDLER_TYPE_DROPBOX) { wmEventHandler_Dropbox *handler = (wmEventHandler_Dropbox *)handler_base; if (handler->dropboxes) { LISTBASE_FOREACH (wmDropBox *, drop, handler->dropboxes) { - const char *tooltip = NULL; - if (drop->poll(C, drag, event, &tooltip) && + if (drop->poll(C, drag, event) && WM_operator_poll_context(C, drop->ot, drop->opcontext)) { - /* XXX Doing translation here might not be ideal, but later we have no more - * access to ot (and hence op context)... */ - return (tooltip) ? tooltip : WM_operatortype_name(drop->ot, drop->ptr); + return drop; } } } @@ -242,29 +255,22 @@ static const char *dropbox_active(bContext *C, return NULL; } -/* return active operator name when mouse is in box */ -static const char *wm_dropbox_active(bContext *C, wmDrag *drag, const wmEvent *event) +/* return active operator tooltip/name when mouse is in box */ +static char *wm_dropbox_active(bContext *C, wmDrag *drag, const wmEvent *event) { wmWindow *win = CTX_wm_window(C); - ScrArea *area = CTX_wm_area(C); - ARegion *region = CTX_wm_region(C); - const char *name; - - name = dropbox_active(C, &win->handlers, drag, event); - if (name) { - return name; + wmDropBox *drop = dropbox_active(C, &win->handlers, drag, event); + if (!drop) { + ScrArea *area = CTX_wm_area(C); + drop = dropbox_active(C, &area->handlers, drag, event); } - - name = dropbox_active(C, &area->handlers, drag, event); - if (name) { - return name; + if (!drop) { + ARegion *region = CTX_wm_region(C); + drop = dropbox_active(C, ®ion->handlers, drag, event); } - - name = dropbox_active(C, ®ion->handlers, drag, event); - if (name) { - return name; + if (drop) { + return dropbox_tooltip(C, drag, event, drop); } - return NULL; } @@ -279,17 +285,18 @@ static void wm_drop_operator_options(bContext *C, wmDrag *drag, const wmEvent *e return; } - drag->opname[0] = 0; + drag->tooltip[0] = 0; /* check buttons (XXX todo rna and value) */ if (UI_but_active_drop_name(C)) { - BLI_strncpy(drag->opname, IFACE_("Paste name"), sizeof(drag->opname)); + BLI_strncpy(drag->tooltip, IFACE_("Paste name"), sizeof(drag->tooltip)); } else { - const char *opname = wm_dropbox_active(C, drag, event); + char *tooltip = wm_dropbox_active(C, drag, event); - if (opname) { - BLI_strncpy(drag->opname, opname, sizeof(drag->opname)); + if (tooltip) { + BLI_strncpy(drag->tooltip, tooltip, sizeof(drag->tooltip)); + MEM_freeN(tooltip); // WM_cursor_modal_set(win, WM_CURSOR_COPY); } // else @@ -462,7 +469,7 @@ static void wm_drop_operator_draw(const char *name, int x, int y) UI_fontstyle_draw_simple_backdrop(fstyle, x, y, name, col_fg, col_bg); } -static const char *wm_drag_name(wmDrag *drag) +const char *WM_drag_get_item_name(wmDrag *drag) { switch (drag->type) { case WM_DRAG_ID: { @@ -576,15 +583,15 @@ void wm_drags_draw(bContext *C, wmWindow *win, rcti *rect) } if (rect) { - int w = UI_fontstyle_string_width(fstyle, wm_drag_name(drag)); + int w = UI_fontstyle_string_width(fstyle, WM_drag_get_item_name(drag)); drag_rect_minmax(rect, x, y, x + w, y + iconsize); } else { - UI_fontstyle_draw_simple(fstyle, x, y, wm_drag_name(drag), text_col); + UI_fontstyle_draw_simple(fstyle, x, y, WM_drag_get_item_name(drag), text_col); } /* operator name with roundbox */ - if (drag->opname[0]) { + if (drag->tooltip[0]) { if (drag->imb) { x = cursorx - drag->sx / 2; @@ -607,11 +614,11 @@ void wm_drags_draw(bContext *C, wmWindow *win, rcti *rect) } if (rect) { - int w = UI_fontstyle_string_width(fstyle, wm_drag_name(drag)); + int w = UI_fontstyle_string_width(fstyle, WM_drag_get_item_name(drag)); drag_rect_minmax(rect, x, y, x + w, y + iconsize); } else { - wm_drop_operator_draw(drag->opname, x, y); + wm_drop_operator_draw(drag->tooltip, x, y); } } } |