[Bf-blender-cvs] [1ec126887ed] temp-dynamic-overrides: UI: fix popovers not properly working with scroll arrows for long menus.

Brecht Van Lommel noreply at git.blender.org
Sun May 13 19:14:35 CEST 2018


Commit: 1ec126887edbb605bc12b86ef3f5854c641cbacd
Author: Brecht Van Lommel
Date:   Sun May 13 18:23:21 2018 +0200
Branches: temp-dynamic-overrides
https://developer.blender.org/rB1ec126887edbb605bc12b86ef3f5854c641cbacd

UI: fix popovers not properly working with scroll arrows for long menus.

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

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_region_popup.c
M	source/blender/editors/interface/interface_widgets.c

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

diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 850b84dcd4b..f0db1782a7e 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -525,6 +525,7 @@ void    UI_block_direction_set(uiBlock *block, char direction);
 void    UI_block_order_flip(uiBlock *block);
 void    UI_block_flag_enable(uiBlock *block, int flag);
 void    UI_block_flag_disable(uiBlock *block, int flag);
+void    UI_block_translate(uiBlock *block, int x, int y);
 
 int     UI_but_return_value_get(uiBut *but);
 
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index b63ba4166a7..be0c84f7d80 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -262,7 +262,7 @@ void ui_region_winrct_get_no_margin(const struct ARegion *ar, struct rcti *r_rec
 
 /* ******************* block calc ************************* */
 
-void ui_block_translate(uiBlock *block, int x, int y)
+void UI_block_translate(uiBlock *block, int x, int y)
 {
 	uiBut *but;
 
@@ -372,7 +372,7 @@ static void ui_block_bounds_calc_centered(wmWindow *window, uiBlock *block)
 	startx = (xmax * 0.5f) - (width * 0.5f);
 	starty = (ymax * 0.5f) - (height * 0.5f);
 	
-	ui_block_translate(block, startx - block->rect.xmin, starty - block->rect.ymin);
+	UI_block_translate(block, startx - block->rect.xmin, starty - block->rect.ymin);
 	
 	/* now recompute bounds and safety */
 	ui_block_bounds_calc(block);
@@ -386,7 +386,7 @@ static void ui_block_bounds_calc_centered_pie(uiBlock *block)
 	    block->pie_data.pie_center_spawned[1]
 	};
 
-	ui_block_translate(block, xy[0], xy[1]);
+	UI_block_translate(block, xy[0], xy[1]);
 
 	/* now recompute bounds and safety */
 	ui_block_bounds_calc(block);
@@ -446,7 +446,7 @@ static void ui_block_bounds_calc_popup(
 	rect_bounds.ymax = ymax - UI_POPUP_MENU_TOP;
 
 	BLI_rcti_clamp(&rect, &rect_bounds, ofs_dummy);
-	ui_block_translate(block, rect.xmin - block->rect.xmin, rect.ymin - block->rect.ymin);
+	UI_block_translate(block, rect.xmin - block->rect.xmin, rect.ymin - block->rect.ymin);
 
 	/* now recompute bounds and safety */
 	ui_block_bounds_calc(block);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 7977b36a1f3..f8bf6d95c8c 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -8936,6 +8936,9 @@ static int ui_menu_scroll(ARegion *ar, uiBlock *block, int my, uiBut *to_bt)
 				dy = block->rect.ymin - ymin + UI_MENU_SCROLL_PAD;
 		}
 
+		/* remember scroll offset for refreshes */
+		block->handle->scrolloffset += dy;
+
 		/* apply scroll offset */
 		for (bt = block->buttons.first; bt; bt = bt->next) {
 			bt->rect.ymin += dy;
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index de2217a3d3e..280156a5290 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -501,7 +501,6 @@ extern int  ui_but_is_pushed(uiBut *but) ATTR_WARN_UNUSED_RESULT;
 void ui_but_override_flag(uiBut *but);
 
 extern void ui_block_bounds_calc(uiBlock *block);
-extern void ui_block_translate(uiBlock *block, int x, int y);
 
 extern struct ColorManagedDisplay *ui_block_cm_display_get(uiBlock *block);
 void ui_block_cm_to_display_space_v3(uiBlock *block, float pixel[3]);
@@ -554,6 +553,7 @@ struct uiPopupBlockHandle {
 	bool refresh;
 
 	struct wmTimer *scrolltimer;
+	float scrolloffset;
 
 	struct uiKeyNavLock keynav_state;
 
diff --git a/source/blender/editors/interface/interface_region_popup.c b/source/blender/editors/interface/interface_region_popup.c
index e971edb95cb..db3c8742e09 100644
--- a/source/blender/editors/interface/interface_region_popup.c
+++ b/source/blender/editors/interface/interface_region_popup.c
@@ -560,7 +560,7 @@ uiBlock *ui_popup_block_refresh(
 			block->pie_data.pie_center_spawned[0] += x_offset;
 			block->pie_data.pie_center_spawned[1] += y_offset;
 
-			ui_block_translate(block, x_offset, y_offset);
+			UI_block_translate(block, x_offset, y_offset);
 
 			if (U.pie_initial_timeout > 0)
 				block->pie_data.flags |= UI_PIE_INITIAL_DIRECTION;
@@ -590,7 +590,7 @@ uiBlock *ui_popup_block_refresh(
 		 * the same height. */
 		if (handle->refresh && handle->prev_block_rect.ymax > block->rect.ymax) {
 			float offset = handle->prev_block_rect.ymax - block->rect.ymax;
-			ui_block_translate(block, 0, offset);
+			UI_block_translate(block, 0, offset);
 			block->rect.ymin = handle->prev_block_rect.ymin;
 		}
 
@@ -604,7 +604,15 @@ uiBlock *ui_popup_block_refresh(
 		ar->winrct.ymin = block->rect.ymin - margin;
 		ar->winrct.ymax = block->rect.ymax + UI_POPUP_MENU_TOP;
 
-		ui_block_translate(block, -ar->winrct.xmin, -ar->winrct.ymin);
+		UI_block_translate(block, -ar->winrct.xmin, -ar->winrct.ymin);
+
+		/* apply scroll offset */
+		if (handle->scrolloffset != 0.0f) {
+			for (uiBut *bt = block->buttons.first; bt; bt = bt->next) {
+				bt->rect.ymin += handle->scrolloffset;
+				bt->rect.ymax += handle->scrolloffset;
+			}
+		}
 	}
 
 	if (block_old) {
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 6c558bcc961..7053f2833c3 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -4621,16 +4621,8 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
 	}
 }
 
-void ui_draw_menu_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
+static void ui_draw_clip_tri(uiBlock *block, rcti *rect, uiWidgetType *wt)
 {
-	uiWidgetType *wt = widget_type(UI_WTYPE_MENU_BACK);
-	
-	wt->state(wt, 0);
-	if (block)
-		wt->draw(&wt->wcol, rect, block->flag, block->direction);
-	else
-		wt->draw(&wt->wcol, rect, 0, 0);
-
 	if (block) {
 		float draw_color[4];
 		unsigned char *color = (unsigned char *)wt->wcol.text;
@@ -4651,6 +4643,19 @@ void ui_draw_menu_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
 	}
 }
 
+void ui_draw_menu_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
+{
+	uiWidgetType *wt = widget_type(UI_WTYPE_MENU_BACK);
+
+	wt->state(wt, 0);
+	if (block)
+		wt->draw(&wt->wcol, rect, block->flag, block->direction);
+	else
+		wt->draw(&wt->wcol, rect, 0, 0);
+
+	ui_draw_clip_tri(block, rect, wt);
+}
+
 /**
  * Similar to 'widget_menu_back', however we can't use the widget preset system
  * because we need to pass in the original location so we know where to show the arrow.
@@ -4708,17 +4713,19 @@ static void ui_draw_popover_back_impl(
 
 void ui_draw_popover_back(ARegion *ar, uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
 {
+	uiWidgetType *wt = widget_type(UI_WTYPE_MENU_BACK);
+
 	if (block) {
 		float mval_origin[2] = {block->mx, block->my};
 		ui_window_to_block_fl(ar, block, &mval_origin[0], &mval_origin[1]);
 		ui_draw_popover_back_impl(&wcol_menu_back, rect, block->direction, mval_origin);
 	}
 	else {
-		uiWidgetType *wt = widget_type(UI_WTYPE_MENU_BACK);
-
 		wt->state(wt, 0);
 		wt->draw(&wt->wcol, rect, 0, 0);
 	}
+
+	ui_draw_clip_tri(block, rect, wt);
 }
 
 static void draw_disk_shaded(



More information about the Bf-blender-cvs mailing list