[Bf-blender-cvs] [ea2043e] master: UI: Add support for popups to refresh their layput (D578)

Campbell Barton noreply at git.blender.org
Sat Jun 14 17:45:55 CEST 2014


Commit: ea2043eb3a31468d9afeb1d6cc140567e219565f
Author: Campbell Barton
Date:   Sun Jun 15 01:40:15 2014 +1000
https://developer.blender.org/rBea2043eb3a31468d9afeb1d6cc140567e219565f

UI: Add support for popups to refresh their layput (D578)

This is needed for popups to chance state once activated,
currently it makes use of operators `check` callback, after values are modified,
as the file selector does already.

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

M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_layout.c
M	source/blender/editors/interface/interface_regions.c
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/screen/area.c
M	source/blender/editors/space_node/node_select.c
M	source/blender/editors/util/undo.c
M	source/blender/makesdna/DNA_screen_types.h
M	source/blender/windowmanager/intern/wm_operators.c

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

diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 060702f..d31be3e 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -60,6 +60,7 @@ void    ED_region_init(struct bContext *C, struct ARegion *ar);
 void    ED_region_tag_redraw(struct ARegion *ar);
 void    ED_region_tag_redraw_partial(struct ARegion *ar, struct rcti *rct);
 void    ED_region_tag_redraw_overlay(struct ARegion *ar);
+void    ED_region_tag_refresh_ui(struct ARegion *ar);
 void    ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *ar);
 void    ED_region_panels(const struct bContext *C, struct ARegion *ar, int vertical, const char *context, int contextnr);
 void    ED_region_header_init(struct ARegion *ar);
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 8de9650..480e8f1 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -380,8 +380,10 @@ void uiPupBlockClose(struct bContext *C, uiBlock *block);
  * */
 
 uiBlock *uiBeginBlock(const struct bContext *C, struct ARegion *region, const char *name, short dt);
+void uiEndBlock_ex(const struct bContext *C, uiBlock *block, const int xy[2]);
 void uiEndBlock(const struct bContext *C, uiBlock *block);
 void uiDrawBlock(const struct bContext *C, struct uiBlock *block);
+void uiBlockUpdateFromOld(const struct bContext *C, struct uiBlock *block);
 
 uiBlock *uiGetBlock(const char *name, struct ARegion *ar);
 
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index d9c5811..0f4bba8 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -295,9 +295,8 @@ void ui_bounds_block(uiBlock *block)
 	block->safety.ymax = block->rect.ymax + xof;
 }
 
-static void ui_centered_bounds_block(const bContext *C, uiBlock *block)
+static void ui_centered_bounds_block(wmWindow *window, uiBlock *block)
 {
-	wmWindow *window = CTX_wm_window(C);
 	int xmax, ymax;
 	int startx, starty;
 	int width, height;
@@ -322,9 +321,9 @@ static void ui_centered_bounds_block(const bContext *C, uiBlock *block)
 	ui_bounds_block(block);
 	
 }
-static void ui_popup_bounds_block(const bContext *C, uiBlock *block, eBlockBoundsCalc bounds_calc)
+static void ui_popup_bounds_block(wmWindow *window, uiBlock *block,
+                                  eBlockBoundsCalc bounds_calc, const int xy[2])
 {
-	wmWindow *window = CTX_wm_window(C);
 	int startx, starty, endx, endy, width, height, oldwidth, oldheight;
 	int oldbounds, xmax, ymax;
 	const int margin = UI_SCREEN_MARGIN;
@@ -362,8 +361,8 @@ static void ui_popup_bounds_block(const bContext *C, uiBlock *block, eBlockBound
 
 	/* offset block based on mouse position, user offset is scaled
 	 * along in case we resized the block in ui_text_bounds_block */
-	startx = window->eventstate->x + block->rect.xmin + (block->mx * width) / oldwidth;
-	starty = window->eventstate->y + block->rect.ymin + (block->my * height) / oldheight;
+	startx = xy[0] + block->rect.xmin + (block->mx * width) / oldwidth;
+	starty = xy[1] + block->rect.ymin + (block->my * height) / oldheight;
 
 	if (startx < margin)
 		startx = margin;
@@ -1083,29 +1082,50 @@ static void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
 	}
 }
 
-void uiEndBlock(const bContext *C, uiBlock *block)
+void uiBlockUpdateFromOld(const bContext *C, uiBlock *block)
 {
-	const bool has_old = (block->oldblock != NULL);
-	/* avoid searches when old/new lists align */
-	uiBut *but_old = has_old ? block->oldblock->buttons.first : NULL;
-
+	uiBut *but_old;
 	uiBut *but;
-	Scene *scene = CTX_data_scene(C);
 
+	if (!block->oldblock)
+		return;
+
+	but_old = block->oldblock->buttons.first;
 
-	if (has_old && BLI_listbase_is_empty(&block->oldblock->butstore) == false) {
+	if (BLI_listbase_is_empty(&block->oldblock->butstore) == false) {
 		UI_butstore_update(block);
 	}
 
+	for (but = block->buttons.first; but; but = but->next) {
+		if (ui_but_update_from_old_block(C, block, &but, &but_old)) {
+			ui_check_but(but);
+		}
+	}
+
+	block->auto_open = block->oldblock->auto_open;
+	block->auto_open_last = block->oldblock->auto_open_last;
+	block->tooltipdisabled = block->oldblock->tooltipdisabled;
+	copy_v3_v3(ui_block_hsv_get(block),
+	           ui_block_hsv_get(block->oldblock));
+
+	block->oldblock = NULL;
+}
+
+void uiEndBlock_ex(const bContext *C, uiBlock *block, const int xy[2])
+{
+	wmWindow *window = CTX_wm_window(C);
+	Scene *scene = CTX_data_scene(C);
+	uiBut *but;
+
+	BLI_assert(block->active);
+
+	uiBlockUpdateFromOld(C, block);
+
 	/* inherit flags from 'old' buttons that was drawn here previous, based
 	 * on matching buttons, we need this to make button event handling non
 	 * blocking, while still allowing buttons to be remade each redraw as it
 	 * is expected by blender code */
 	for (but = block->buttons.first; but; but = but->next) {
-		if (has_old && ui_but_update_from_old_block(C, block, &but, &but_old)) {
-			ui_check_but(but);
-		}
-		
 		/* temp? Proper check for graying out */
 		if (but->optype) {
 			wmOperatorType *ot = but->optype;
@@ -1125,15 +1145,7 @@ void uiEndBlock(const bContext *C, uiBlock *block)
 		ui_but_anim_flag(but, (scene) ? scene->r.cfra : 0.0f);
 	}
 
-	if (block->oldblock) {
-		block->auto_open = block->oldblock->auto_open;
-		block->auto_open_last = block->oldblock->auto_open_last;
-		block->tooltipdisabled = block->oldblock->tooltipdisabled;
-		copy_v3_v3(ui_block_hsv_get(block),
-		           ui_block_hsv_get(block->oldblock));
 
-		block->oldblock = NULL;
-	}
 
 	/* handle pending stuff */
 	if (block->layouts.first) {
@@ -1159,13 +1171,13 @@ void uiEndBlock(const bContext *C, uiBlock *block)
 			ui_text_bounds_block(block, 0.0f);
 			break;
 		case UI_BLOCK_BOUNDS_POPUP_CENTER:
-			ui_centered_bounds_block(C, block);
+			ui_centered_bounds_block(window, block);
 			break;
 
 			/* fallback */
 		case UI_BLOCK_BOUNDS_POPUP_MOUSE:
 		case UI_BLOCK_BOUNDS_POPUP_MENU:
-			ui_popup_bounds_block(C, block, block->bounds_type);
+			ui_popup_bounds_block(window, block, block->bounds_type, xy);
 			break;
 	}
 
@@ -1179,6 +1191,13 @@ void uiEndBlock(const bContext *C, uiBlock *block)
 	block->endblock = 1;
 }
 
+void uiEndBlock(const bContext *C, uiBlock *block)
+{
+	wmWindow *window = CTX_wm_window(C);
+
+	uiEndBlock_ex(C, block, &window->eventstate->x);
+}
+
 /* ************** BLOCK DRAWING FUNCTION ************* */
 
 void ui_fontscale(short *points, float aspect)
@@ -2418,6 +2437,7 @@ void uiBlockSetRegion(uiBlock *block, ARegion *region)
 		if (oldblock) {
 			oldblock->active = 0;
 			oldblock->panel = NULL;
+			oldblock->handle = NULL;
 		}
 
 		/* at the beginning of the list! for dynamical menus/blocks */
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index c2deee4..bf8e46b 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -5516,7 +5516,6 @@ static uiBlock *menu_change_shortcut(bContext *C, ARegion *ar, void *arg)
 	uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT | UI_ITEM_R_IMMEDIATE, "", ICON_NONE);
 	
 	uiPopupBoundsBlock(block, 6, -50, 26);
-	uiEndBlock(C, block);
 	
 	return block;
 }
@@ -5561,7 +5560,6 @@ static uiBlock *menu_add_shortcut(bContext *C, ARegion *ar, void *arg)
 	uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT | UI_ITEM_R_IMMEDIATE, "", ICON_NONE);
 	
 	uiPopupBoundsBlock(block, 6, -50, 26);
-	uiEndBlock(C, block);
 	
 	return block;
 }
@@ -7762,6 +7760,8 @@ static int ui_handle_menu_event(
 				sub_v2_v2v2_int(mdiff, &event->x, menu->grab_xy_prev);
 				copy_v2_v2_int(menu->grab_xy_prev, &event->x);
 
+				add_v2_v2v2_int(menu->popup_create_vars.event_xy, menu->popup_create_vars.event_xy, mdiff);
+
 				ui_popup_translate(C, ar, mdiff);
 			}
 
@@ -8414,10 +8414,13 @@ static int ui_handler_region_menu(bContext *C, const wmEvent *event, void *UNUSE
 static int ui_handler_popup(bContext *C, const wmEvent *event, void *userdata)
 {
 	uiPopupBlockHandle *menu = userdata;
-
+	struct ARegion *menu_region;
 	/* we block all events, this is modal interaction, except for drop events which is described below */
 	int retval = WM_UI_HANDLER_BREAK;
 
+	menu_region = CTX_wm_menu(C);
+	CTX_wm_menu_set(C, menu->region);
+
 	if (event->type == EVT_DROP) {
 		/* if we're handling drop event we'll want it to be handled by popup callee as well,
 		 * so it'll be possible to perform such operations as opening .blend files by dropping
@@ -8465,6 +8468,8 @@ static int ui_handler_popup(bContext *C, const wmEvent *event, void *userdata)
 	/* delayed apply callbacks */
 	ui_apply_but_funcs_after(C);
 
+	CTX_wm_region_set(C, menu_region);
+
 	return retval;
 }
 
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index d44aacf..cd3b639 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -428,6 +428,19 @@ struct uiKeyNavLock {
 	int event_xy[2];
 };
 
+typedef uiBlock * (*uiBlockHandleCreateFunc)(struct bContext *C, struct uiPopupBlockHandle *handle, void *arg1);
+
+struct uiPopupBlockCreate {
+	uiBlockCreateFunc              create_func;
+	uiBlockHandleCreateFunc handle_create_func;
+	void *arg;
+
+	int event_xy[2];
+
+	/* when popup is initialized from a button */
+	ARegion *butregion;
+};
+
 struct uiPopupBlockHandle {
 	/* internal */
 	struct ARegion *region;
@@ -442,6 +455,9 @@ struct uiPopupBlockHandle {
 	void (*cancel_func)(struct bContext *C, void *arg);
 	void *popup_arg;
 	
+	/* store data for refreshing popups */
+	struct uiPopupBlockCreate popup_create_vars;
+
 	struct wmTimer *scrolltimer;
 
 	struct uiKeyNavLock keynav_state;
@@ -496,7 +512,8 @@ bool ui_searchbox_apply(uiBut *but, struct ARegion *ar);
 void ui_searchbox_free(struct bContext *C, struct ARegion *ar);
 void ui_but_search_test(uiBut *but);
 
-typedef uiBlock * (*uiBlockHandleCreateFunc)(struct bContext *C, struct ui

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list