[Bf-blender-cvs] [a14005c070a] blender2.8: UI: fix popover menus not refreshing when changing settings.

Brecht Van Lommel noreply at git.blender.org
Sat Apr 28 10:44:40 CEST 2018


Commit: a14005c070a1f3b7a1ed2013c61a359e816734fa
Author: Brecht Van Lommel
Date:   Fri Apr 27 19:30:25 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBa14005c070a1f3b7a1ed2013c61a359e816734fa

UI: fix popover menus not refreshing when changing settings.

===================================================================

M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_region_popover.c
M	source/blender/editors/interface/interface_region_popup.c

===================================================================

diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 968007f42f7..9f41f9175c4 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -422,10 +422,7 @@ void UI_popup_menu_but_set(uiPopupMenu *pup, struct ARegion *butregion, uiBut *b
 
 typedef struct uiPopover uiPopover;
 
-uiPopover *UI_popover_begin(
-        struct bContext *C) ATTR_NONNULL();
-uiPopover *UI_popover_begin_ex(
-        struct bContext *C, const char *block_name) ATTR_NONNULL();
+uiPopover *UI_popover_begin(struct bContext *C) ATTR_NONNULL();
 void UI_popover_end(struct bContext *C, struct uiPopover *head);
 struct uiLayout *UI_popover_layout(uiPopover *head);
 
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 2c477b92885..9245fa2007d 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -635,11 +635,8 @@ PointerRNA *ui_handle_afterfunc_add_operator(wmOperatorType *ot, int opcontext,
 
 static void popup_check(bContext *C, wmOperator *op)
 {
-	if (op && op->type->check && op->type->check(C, op)) {
-		/* check for popup and re-layout buttons */
-		ARegion *ar_menu = CTX_wm_menu(C);
-		if (ar_menu)
-			ED_region_tag_refresh_ui(ar_menu);
+	if (op && op->type->check) {
+		op->type->check(C, op);
 	}
 }
 
@@ -779,7 +776,7 @@ static void ui_apply_but_funcs_after(bContext *C)
 
 		if (after.popup_op)
 			popup_check(C, after.popup_op);
-		
+
 		if (after.opptr) {
 			/* free in advance to avoid leak on exit */
 			opptr = *after.opptr;
@@ -7936,8 +7933,9 @@ static void button_activate_exit(
 		WM_cursor_modal_restore(data->window);
 	}
 
-	/* redraw (data is but->active!) */
+	/* redraw and refresh (for popups) */
 	ED_region_tag_redraw(data->region);
+	ED_region_tag_refresh_ui(data->region);
 
 	/* clean up button */
 	if (but->active) {
@@ -8589,13 +8587,8 @@ static int ui_handle_list_event(bContext *C, const wmEvent *event, ARegion *ar,
 	}
 
 	if (redraw) {
-		if (listbox->block->flag & UI_BLOCK_POPUP) {
-			/* popups need special refreshing */
-			ED_region_tag_refresh_ui(ar);
-		}
-		else {
-			ED_region_tag_redraw(ar);
-		}
+		ED_region_tag_redraw(ar);
+		ED_region_tag_refresh_ui(ar);
 	}
 
 	return retval;
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 8353a17a359..6082b3ab7b0 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -519,16 +519,19 @@ struct uiKeyNavLock {
 };
 
 typedef uiBlock * (*uiBlockHandleCreateFunc)(struct bContext *C, struct uiPopupBlockHandle *handle, void *arg1);
+typedef void (*uiBlockHandleFreeFunc)(struct uiPopupBlockHandle *handle, void *arg1);
 
 struct uiPopupBlockCreate {
-	uiBlockCreateFunc              create_func;
+	uiBlockCreateFunc       create_func;
 	uiBlockHandleCreateFunc handle_create_func;
+	uiBlockHandleFreeFunc   free_func;
 	void *arg;
 
 	int event_xy[2];
 
 	/* when popup is initialized from a button */
 	ARegion *butregion;
+	uiBut *but;
 };
 
 struct uiPopupBlockHandle {
diff --git a/source/blender/editors/interface/interface_region_popover.c b/source/blender/editors/interface/interface_region_popover.c
index bf75af524b7..ea8c4d9ddce 100644
--- a/source/blender/editors/interface/interface_region_popover.c
+++ b/source/blender/editors/interface/interface_region_popover.c
@@ -74,121 +74,115 @@ struct uiPopover {
 	uiBlock *block;
 	uiLayout *layout;
 	uiBut *but;
-	ARegion *butregion;
-
-	int mx, my;
-	bool popover, slideout;
 
 	uiMenuCreateFunc menu_func;
 	void *menu_arg;
 };
 
-static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, void *arg_pup)
+static void ui_popover_create_block(bContext *C, uiPopover *pup, int opcontext)
 {
-	uiBlock *block;
-	uiPopover *pup = arg_pup;
-	int minwidth, width, height;
+	uiStyle *style = UI_style_get_dpi();
 
-	if (pup->menu_func) {
-		pup->block->handle = handle;
-		pup->menu_func(C, pup->layout, pup->menu_arg);
-		pup->block->handle = NULL;
-	}
+	pup->block = UI_block_begin(C, NULL, __func__, UI_EMBOSS);
+	pup->layout = UI_block_layout(
+	        pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0,
+	        U.widget_unit * UI_POPOVER_WIDTH_UNITS, 0, MENU_PADDING, style);
+
+	uiLayoutSetOperatorContext(pup->layout, opcontext);
 
 	if (pup->but) {
-		/* minimum width to enforece */
-		minwidth = BLI_rctf_size_x(&pup->but->rect);
+		if (pup->but->context) {
+			uiLayoutContextCopy(pup->layout, pup->but->context);
+		}
 	}
 	else {
-		minwidth = UI_MENU_WIDTH_MIN;
+		/* Some enums reversing is strange, currently we have no good way to
+		 * reverse some enum's but not others, so reverse all so the first menu
+		 * items are always close to the mouse cursor. */
+		pup->block->flag |= UI_BLOCK_NO_FLIP;
 	}
+}
 
-	block = pup->block;
+static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, void *arg_pup)
+{
+	uiPopover *pup = arg_pup;
 
-	/* in some cases we create the block before the region,
-	 * so we set it delayed here if necessary */
-	if (BLI_findindex(&handle->region->uiblocks, block) == -1)
-		UI_block_region_set(block, handle->region);
+	/* Create UI block and layout now if it wasn't done between begin/end. */
+	if (!pup->layout) {
+		ui_popover_create_block(C, pup, WM_OP_INVOKE_REGION_WIN);
 
-	UI_block_layout_resolve(block, &width, &height);
+		if (pup->menu_func) {
+			pup->block->handle = handle;
+			pup->menu_func(C, pup->layout, pup->menu_arg);
+			pup->block->handle = NULL;
+		}
 
-	UI_block_flag_enable(block, UI_BLOCK_MOVEMOUSE_QUIT | UI_BLOCK_KEEP_OPEN | UI_BLOCK_POPOVER);
+		pup->layout = NULL;
+	}
+
+	/* Setup and resolve UI layout for block. */
+	uiBlock *block = pup->block;
+	int width, height;
 
+	UI_block_region_set(block, handle->region);
+	UI_block_layout_resolve(block, &width, &height);
+	UI_block_flag_enable(block, UI_BLOCK_MOVEMOUSE_QUIT | UI_BLOCK_KEEP_OPEN | UI_BLOCK_POPOVER);
 	UI_block_direction_set(block, UI_DIR_DOWN | UI_DIR_CENTER_X);
 
 	const int block_margin = U.widget_unit / 2;
 
-	if (pup->popover) {
+	if (pup->but) {
+		/* For a header menu we set the direction automatic. */
+		block->minbounds = BLI_rctf_size_x(&pup->but->rect);
+		UI_block_bounds_set_normal(block, block_margin);
+
+		/* If menu slides out of other menu, override direction. */
+		bool slideout = false; //ui_block_is_menu(pup->but->block);
+		if (slideout)
+			UI_block_direction_set(block, UI_DIR_RIGHT);
+	}
+	else {
+		/* Not attached to a button. */
 		int offset[2] = {0, 0};  /* Dummy. */
 		UI_block_flag_enable(block, UI_BLOCK_LOOP);
 		UI_block_direction_set(block, block->direction);
-		block->minbounds = minwidth;
+		block->minbounds = UI_MENU_WIDTH_MIN;
 		UI_block_bounds_set_popup(block, block_margin, offset[0], offset[1]);
 	}
-	else {
-		/* for a header menu we set the direction automatic */
-		block->minbounds = minwidth;
-		UI_block_bounds_set_normal(block, block_margin);
-	}
 
-	/* if menu slides out of other menu, override direction */
-	if (pup->slideout)
-		UI_block_direction_set(block, UI_DIR_RIGHT);
+	return block;
+}
 
-	return pup->block;
+static void ui_block_free_func_POPOVER(uiPopupBlockHandle *UNUSED(handle), void *arg_pup)
+{
+	uiPopover *pup = arg_pup;
+	MEM_freeN(pup);
 }
 
 uiPopupBlockHandle *ui_popover_panel_create(
         bContext *C, ARegion *butregion, uiBut *but,
         uiMenuCreateFunc menu_func, void *arg)
 {
-	wmWindow *window = CTX_wm_window(C);
-	uiStyle *style = UI_style_get_dpi();
-	uiPopupBlockHandle *handle;
-	uiPopover *pup;
-
-	pup = MEM_callocN(sizeof(uiPopover), __func__);
-	pup->block = UI_block_begin(C, NULL, __func__, UI_EMBOSS);
-	UI_block_emboss_set(pup->block, UI_EMBOSS);
-	pup->layout = UI_block_layout(
-	        pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0,
-	        U.widget_unit * UI_POPOVER_WIDTH_UNITS, 0, MENU_PADDING, style);
-	pup->slideout = false; // but ? ui_block_is_menu(but->block) : false;
+	/* Create popover, buttons are created from callback. */
+	uiPopover *pup = MEM_callocN(sizeof(uiPopover), __func__);
 	pup->but = but;
-	uiLayoutSetOperatorContext(pup->layout, WM_OP_INVOKE_REGION_WIN);
-
-	if (!but) {
-		/* no button to start from, means we are a popover */
-		pup->mx = window->eventstate->x;
-		pup->my = window->eventstate->y;
-		pup->popover = true;
-		pup->block->flag |= UI_BLOCK_NO_FLIP;
-	}
-	/* some enums reversing is strange, currently we have no good way to
-	 * reverse some enum's but not others, so reverse all so the first menu
-	 * items are always close to the mouse cursor */
-	else {
-		if (but->context) {
-			uiLayoutContextCopy(pup->layout, but->context);
-		}
-	}
-
-	/* menu is created from a callback */
 	pup->menu_func = menu_func;
 	pup->menu_arg = arg;
 
+	/* Create popup block. */
+	uiPopupBlockHandle *handle;
 	handle = ui_popup_block_create(C, butregion, but, NULL, ui_block_func_POPOVER, pup);
+	handle->popup_create_vars.free_func = ui_block_free_func_POPOVER;
 
+	/* Add handlers. If attached to a button, the button will already
+	 * add a modal handler and pass on events. */
 	if (!but) {
-		handle->popup = true;
-
+		wmWindow *window = CTX_wm_window(C);
 		UI_popup_handlers_add(C, &window->modalhandlers, handle, 0);
 		WM_event_add_mousemove(C);
+		handle->popup = true;
 	}
 
-	handle->can_refresh = false;
-	MEM_freeN(pup);
-
 	return handle;
 }
 
@@ -200,20 +194,13 @@ uiPopupBlockHandle *ui_popover_panel_create(
 
 /**
  * Only return handler, and set optional title.
- * \param block_name: Assigned to uiBlock.name (useful info for debugging).
  */
-uiPopover *UI_popover_begin_ex(bContext *C, const char *block_name)
+uiPopover *UI_popover_begin(bContext *C)
 {
-	uiStyle *style = UI_style_get_dpi();
 	uiPopover *pup = MEM_callocN(sizeof(uiPopover), "popover menu");
 
-	pup->block = UI_block_begin(C, NULL, block_name, UI_EMBOSS);
-	pup->layout = UI_block_layout(
-	        pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0,
-	        U.widget_unit * UI_POPOVER_WIDTH_UNITS, 0, MENU_PADDING, style);
-
-	/* Copied 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list