diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-06-12 17:49:52 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-06-12 17:50:27 +0300 |
commit | 2a3e7fe656e7a9d84b308439598cf9de53d78fff (patch) | |
tree | 04ebb71e829e0c734f44435805dfeaffb4f53300 | |
parent | deb3d73eea3098c2222eeeca9926759f3ec86784 (diff) |
UI: improve HUD ensure/clear logic
Running operators w/o redo now clears the HUD immediately.
-rw-r--r-- | source/blender/editors/include/ED_screen.h | 1 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_region_hud.c | 32 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 32 |
3 files changed, 43 insertions, 22 deletions
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index 97653286f28..9fcefc1e4b1 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -320,6 +320,7 @@ void ED_region_cache_draw_cached_segments(const struct ARegion *ar, const int nu /* interface_region_hud.c */ struct ARegionType *ED_area_type_hud(int space_type); +void ED_area_type_hud_clear(struct wmWindowManager *wm, ScrArea *sa_keep); void ED_area_type_hud_ensure(struct bContext *C, struct ScrArea *sa); /* default keymaps, bitflags */ diff --git a/source/blender/editors/interface/interface_region_hud.c b/source/blender/editors/interface/interface_region_hud.c index ad779d2580f..5a3d2250f20 100644 --- a/source/blender/editors/interface/interface_region_hud.c +++ b/source/blender/editors/interface/interface_region_hud.c @@ -210,27 +210,30 @@ static ARegion *hud_region_add(ScrArea *sa) return ar; } -void ED_area_type_hud_ensure(bContext *C, ScrArea *sa) +void ED_area_type_hud_clear(wmWindowManager *wm, ScrArea *sa_keep) { - /* We only want one at a time. */ - Main *bmain = CTX_data_main(C); - for (wmWindowManager *wm = bmain->wm.first; wm; wm = wm->id.next) { - for (wmWindow *win = wm->windows.first; win; win = win->next) { - bScreen *screen = WM_window_get_active_screen(win); - for (ScrArea *sa_iter = screen->areabase.first; sa_iter; sa_iter = sa_iter->next) { - if (sa != sa_iter) { - for (ARegion *ar = sa_iter->regionbase.first; ar; ar = ar->next) { - if (ar->regiontype == RGN_TYPE_HUD) { - if ((ar->flag & RGN_FLAG_HIDDEN) == 0) { - ar->flag |= RGN_FLAG_HIDDEN; - ED_region_tag_redraw(ar); - } + for (wmWindow *win = wm->windows.first; win; win = win->next) { + bScreen *screen = WM_window_get_active_screen(win); + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + if (sa != sa_keep) { + for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) { + if (ar->regiontype == RGN_TYPE_HUD) { + if ((ar->flag & RGN_FLAG_HIDDEN) == 0) { + ar->flag |= RGN_FLAG_HIDDEN; + ED_region_tag_redraw(ar); + ED_area_tag_redraw(sa); } } } } } } +} + +void ED_area_type_hud_ensure(bContext *C, ScrArea *sa) +{ + wmWindowManager *wm = CTX_wm_manager(C); + ED_area_type_hud_clear(wm, sa); ARegionType *art = BKE_regiontype_from_id(sa->type, RGN_TYPE_HUD); if (art == NULL) { @@ -241,6 +244,7 @@ void ED_area_type_hud_ensure(bContext *C, ScrArea *sa) ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_HUD); if (!last_redo_poll(C)) { if (ar) { + ED_region_tag_redraw(ar); ar->flag |= RGN_FLAG_HIDDEN; } return; diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index ebf771c4745..b3ff823dd2d 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -843,6 +843,7 @@ static bool wm_operator_register_check(wmWindowManager *wm, wmOperatorType *ot) static void wm_operator_finished(bContext *C, wmOperator *op, const bool repeat, const bool store) { wmWindowManager *wm = CTX_wm_manager(C); + enum { NOP, SET, CLEAR, } hud_status = NOP; op->customdata = NULL; @@ -854,10 +855,15 @@ static void wm_operator_finished(bContext *C, wmOperator *op, const bool repeat, * called from operators that already do an undo push. usually * this will happen for python operators that call C operators */ if (wm->op_undo_depth == 0) { - if (op->type->flag & OPTYPE_UNDO) + if (op->type->flag & OPTYPE_UNDO) { ED_undo_push_op(C, op); - else if (op->type->flag & OPTYPE_UNDO_GROUPED) + hud_status = CLEAR; + } + else if (op->type->flag & OPTYPE_UNDO_GROUPED) { ED_undo_grouped_push_op(C, op); + hud_status = CLEAR; + } + } if (repeat == 0) { @@ -875,17 +881,27 @@ static void wm_operator_finished(bContext *C, wmOperator *op, const bool repeat, WM_operator_region_active_win_set(C); /* Show the redo panel. */ - { - ScrArea *sa = CTX_wm_area(C); - if (sa) { - ED_area_type_hud_ensure(C, sa); - } - } + hud_status = SET; } else { WM_operator_free(op); } } + + if (hud_status != NOP) { + if (hud_status == SET) { + ScrArea *sa = CTX_wm_area(C); + if (sa) { + ED_area_type_hud_ensure(C, sa); + } + } + else if (hud_status == CLEAR) { + ED_area_type_hud_clear(wm, NULL); + } + else { + BLI_assert(0); + } + } } /* if repeat is true, it doesn't register again, nor does it free */ |