Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-06-12 17:49:52 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-06-12 17:50:27 +0300
commit2a3e7fe656e7a9d84b308439598cf9de53d78fff (patch)
tree04ebb71e829e0c734f44435805dfeaffb4f53300 /source/blender
parentdeb3d73eea3098c2222eeeca9926759f3ec86784 (diff)
UI: improve HUD ensure/clear logic
Running operators w/o redo now clears the HUD immediately.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/include/ED_screen.h1
-rw-r--r--source/blender/editors/interface/interface_region_hud.c32
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c32
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 */