diff options
Diffstat (limited to 'source/blender/windowmanager')
9 files changed, 159 insertions, 69 deletions
diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt index b5784fe543c..059055daea9 100644 --- a/source/blender/windowmanager/CMakeLists.txt +++ b/source/blender/windowmanager/CMakeLists.txt @@ -73,6 +73,7 @@ set(SRC intern/wm_window.c intern/wm_stereo.c intern/wm_toolsystem.c + intern/wm_tooltip.c manipulators/intern/wm_manipulator.c manipulators/intern/wm_manipulator_group.c manipulators/intern/wm_manipulator_group_type.c diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 85f94721d40..7a66cc04014 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -576,6 +576,17 @@ void WM_toolsystem_link(struct bContext *C, struct WorkSpace *workspace); void WM_toolsystem_set(struct bContext *C, const struct bToolDef *tool); void WM_toolsystem_init(struct bContext *C); +/* wm_tooltip.c */ +typedef struct ARegion *(*wmTooltipInitFn)(struct bContext *, struct ARegion *, bool *); + +void WM_tooltip_timer_init( + struct bContext *C, struct wmWindow *win, struct ARegion *ar, + wmTooltipInitFn init); +void WM_tooltip_timer_clear(struct bContext *C, struct wmWindow *win); +void WM_tooltip_clear(struct bContext *C, struct wmWindow *win); +void WM_tooltip_init(struct bContext *C, struct wmWindow *win); +void WM_tooltip_refresh(struct bContext *C, struct wmWindow *win); + #ifdef __cplusplus } #endif diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 883a680acd7..7254301b874 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -702,6 +702,15 @@ typedef struct wmDropBox { } wmDropBox; +typedef struct wmTooltipState { + struct wmTimer *timer; + struct ARegion *region_from; + struct ARegion *region; + struct ARegion *(*init)(struct bContext *, struct ARegion *, bool *r_exit_on_event); + /* Exit on any event, not needed for buttons since their highlight state is used. */ + bool exit_on_event; +} wmTooltipState; + /* *************** migrated stuff, clean later? ************** */ typedef struct RecentFile { diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 6e559ef7157..133ac6564f8 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2275,30 +2275,13 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers wm_manipulatormap_handler_context(C, handler); wm_region_mouse_co(C, event); - if (event->type == MOUSEMOVE) { - WM_manipulatormap_tooltip_clear(C, mmap); - } - /* handle manipulator highlighting */ if (event->type == MOUSEMOVE && !wm_manipulatormap_modal_get(mmap)) { int part; mpr = wm_manipulatormap_highlight_find(mmap, C, event, &part); wm_manipulatormap_highlight_set(mmap, C, mpr, part); if (mpr != NULL) { - WM_manipulatormap_tooltip_timer_init(C, mmap); - } - } - /* handle user configurable manipulator-map keymap */ - else if ((event->type == TIMER) && - (event->customdata == WM_manipulatormap_tooltip_timer_get(mmap))) - { - if (mpr) { - if (mpr->state & WM_MANIPULATOR_STATE_MODAL) { - WM_manipulatormap_tooltip_clear(C, mmap); - } - else { - WM_manipulatormap_tooltip_create(C, mmap); - } + WM_tooltip_timer_init(C, CTX_wm_window(C), region, WM_manipulatormap_tooltip_init); } } else { @@ -2735,6 +2718,13 @@ void wm_event_do_handlers(bContext *C) CTX_wm_window_set(C, win); + /* Clear tool-tip on mouse move. */ + if (screen->tool_tip && screen->tool_tip->exit_on_event) { + if (ISMOUSE(event->type)) { + WM_tooltip_clear(C, win); + } + } + /* we let modal handlers get active area/region, also wm_paintcursor_test needs it */ CTX_wm_area_set(C, area_event_inside(C, &event->x)); CTX_wm_region_set(C, region_event_inside(C, &event->x)); @@ -2751,7 +2741,16 @@ void wm_event_do_handlers(bContext *C) /* fileread case */ if (CTX_wm_window(C) == NULL) return; - + + /* check for a tooltip */ + if (screen == WM_window_get_active_screen(win)) { + if (screen->tool_tip && screen->tool_tip->timer) { + if ((event->type == TIMER) && (event->customdata == screen->tool_tip->timer)) { + WM_tooltip_init(C, win); + } + } + } + /* check dragging, creates new event or frees, adds draw tag */ wm_event_drag_test(wm, win, event); diff --git a/source/blender/windowmanager/intern/wm_tooltip.c b/source/blender/windowmanager/intern/wm_tooltip.c new file mode 100644 index 00000000000..83d620d1522 --- /dev/null +++ b/source/blender/windowmanager/intern/wm_tooltip.c @@ -0,0 +1,106 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/windowmanager/intern/wm_tooltip.c + * \ingroup wm + * + * Manages a per-window tool-tip. + */ + +#include "MEM_guardedalloc.h" + +#include "BLI_utildefines.h" + +#include "BKE_context.h" + +#include "ED_screen.h" + +#include "UI_interface.h" + +#include "WM_api.h" +#include "WM_types.h" + +void WM_tooltip_timer_init( + bContext *C, wmWindow *win, ARegion *ar, + wmTooltipInitFn init) +{ + bScreen *screen = WM_window_get_active_screen(win); + wmWindowManager *wm = CTX_wm_manager(C); + if (screen->tool_tip == NULL) { + screen->tool_tip = MEM_callocN(sizeof(*screen->tool_tip), __func__); + } + screen->tool_tip->region_from = ar; + screen->tool_tip->timer = WM_event_add_timer(wm, win, TIMER, UI_TOOLTIP_DELAY); + screen->tool_tip->init = init; +} + +void WM_tooltip_timer_clear(bContext *C, wmWindow *win) +{ + wmWindowManager *wm = CTX_wm_manager(C); + bScreen *screen = WM_window_get_active_screen(win); + if (screen->tool_tip != NULL) { + if (screen->tool_tip->timer != NULL) { + WM_event_remove_timer(wm, win, screen->tool_tip->timer); + screen->tool_tip->timer = NULL; + } + } +} + +void WM_tooltip_clear(bContext *C, wmWindow *win) +{ + WM_tooltip_timer_clear(C, win); + bScreen *screen = WM_window_get_active_screen(win); + if (screen->tool_tip != NULL) { + if (screen->tool_tip->region) { + UI_tooltip_free(C, screen, screen->tool_tip->region); + screen->tool_tip->region = NULL; + } + MEM_freeN(screen->tool_tip); + screen->tool_tip = NULL; + } +} + +void WM_tooltip_init(bContext *C, wmWindow *win) +{ + WM_tooltip_timer_clear(C, win); + bScreen *screen = WM_window_get_active_screen(win); + if (screen->tool_tip->region) { + UI_tooltip_free(C, screen, screen->tool_tip->region); + screen->tool_tip->region = NULL; + } + screen->tool_tip->region = screen->tool_tip->init( + C, screen->tool_tip->region_from, &screen->tool_tip->exit_on_event); + if (screen->tool_tip->region == NULL) { + WM_tooltip_clear(C, win); + } +} + +void WM_tooltip_refresh(bContext *C, wmWindow *win) +{ + WM_tooltip_timer_clear(C, win); + bScreen *screen = WM_window_get_active_screen(win); + if (screen->tool_tip != NULL) { + if (screen->tool_tip->region) { + UI_tooltip_free(C, screen, screen->tool_tip->region); + screen->tool_tip->region = NULL; + } + WM_tooltip_init(C, win); + } +} diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h b/source/blender/windowmanager/manipulators/WM_manipulator_api.h index 097af2dadcc..53bee9c6775 100644 --- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h +++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h @@ -259,14 +259,8 @@ bool WM_manipulatormap_minmax( const struct wmManipulatorMap *mmap, bool use_hidden, bool use_select, float r_min[3], float r_max[3]); -void WM_manipulatormap_tooltip_create( - struct bContext *C, struct wmManipulatorMap *mmap); -void WM_manipulatormap_tooltip_clear( - struct bContext *C, struct wmManipulatorMap *mmap); -void WM_manipulatormap_tooltip_timer_init( - struct bContext *C, struct wmManipulatorMap *mmap); -const void *WM_manipulatormap_tooltip_timer_get( - struct wmManipulatorMap *mmap); +struct ARegion *WM_manipulatormap_tooltip_init( + struct bContext *C, struct ARegion *ar, bool *r_exit_on_event); /* -------------------------------------------------------------------- */ /* wmManipulatorMapType */ diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c index 354fd32cbd6..0e63f3d6ffe 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c @@ -500,7 +500,7 @@ static int manipulator_tweak_invoke(bContext *C, wmOperator *op, const wmEvent * wmManipulator *mpr = mmap->mmap_context.highlight; /* Needed for single click actions which don't enter modal state. */ - WM_manipulatormap_tooltip_clear(C, mmap); + WM_tooltip_clear(C, CTX_wm_window(C)); if (!mpr) { /* wm_handlers_do_intern shouldn't let this happen */ diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h index ef3ccaaf47f..b7982cf00df 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h @@ -115,9 +115,6 @@ struct wmManipulatorMap { /* cursor location at point of entering modal (see: WM_MANIPULATOR_GRAB_CURSOR) */ int event_xy[2]; short event_grabcursor; - - struct ARegion *tooltip; - struct wmTimer *tooltip_timer; } mmap_context; }; diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c index 5bd717d3f50..a9875020fbb 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c @@ -904,7 +904,7 @@ void wm_manipulatormap_modal_set( BLI_assert(mmap->mmap_context.modal == NULL); wmWindow *win = CTX_wm_window(C); - WM_manipulatormap_tooltip_clear(C, mmap); + WM_tooltip_clear(C, win); if (mpr->type->invoke && (mpr->type->modal || mpr->custom_modal)) @@ -1018,45 +1018,18 @@ void WM_manipulatormap_message_subscribe( * * \{ */ - -void WM_manipulatormap_tooltip_create( - bContext *C, wmManipulatorMap *mmap) -{ - WM_manipulatormap_tooltip_clear(C, mmap); - if (mmap->mmap_context.highlight) { - mmap->mmap_context.tooltip = UI_tooltip_create_from_manipulator(C, mmap->mmap_context.highlight); - } -} - -void WM_manipulatormap_tooltip_clear( - bContext *C, wmManipulatorMap *mmap) -{ - if (mmap->mmap_context.tooltip_timer != NULL) { - wmWindowManager *wm = CTX_wm_manager(C); - wmWindow *win = CTX_wm_window(C); - WM_event_remove_timer(wm, win, mmap->mmap_context.tooltip_timer); - mmap->mmap_context.tooltip_timer = NULL; - } - if (mmap->mmap_context.tooltip != NULL) { - UI_tooltip_free(C, mmap->mmap_context.tooltip); - mmap->mmap_context.tooltip = NULL; - } -} - -void WM_manipulatormap_tooltip_timer_init( - bContext *C, wmManipulatorMap *mmap) +struct ARegion *WM_manipulatormap_tooltip_init( + struct bContext *C, struct ARegion *ar, bool *r_exit_on_event) { - if (mmap->mmap_context.tooltip_timer == NULL) { - wmWindowManager *wm = CTX_wm_manager(C); - wmWindow *win = CTX_wm_window(C); - /* TODO: BUTTON_TOOLTIP_DELAY */ - mmap->mmap_context.tooltip_timer = WM_event_add_timer(wm, win, TIMER, UI_TOOLTIP_DELAY); + wmManipulatorMap *mmap = ar->manipulator_map; + *r_exit_on_event = true; + if (mmap) { + wmManipulator *mpr = mmap->mmap_context.highlight; + if (mpr) { + return UI_tooltip_create_from_manipulator(C, mpr); + } } -} - -const void *WM_manipulatormap_tooltip_timer_get(wmManipulatorMap *mmap) -{ - return mmap->mmap_context.tooltip_timer; + return NULL; } /** \} */ /* wmManipulatorMapType */ |