diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-05-13 19:23:21 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-05-13 19:24:13 +0300 |
commit | c40c2b5ab7ed9b8ecc5421130a844706bd6ff311 (patch) | |
tree | 487e5eb53c053b8fad2a05328586d9d2bde4bcc1 /source/blender/editors/interface | |
parent | 680bdef12adc2be4c8b62628e55bbf46903edbe7 (diff) |
UI: fix popovers not properly working with scroll arrows for long menus.
Diffstat (limited to 'source/blender/editors/interface')
5 files changed, 37 insertions, 19 deletions
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 1687562d3e0..7ca3ffc8c84 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -8927,6 +8927,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( |