diff --git a/source/blender/editors/interface/interface_region_popup.cc b/source/blender/editors/interface/interface_region_popup.cc index 3cbdf1248da..d5355091ce2 100644 --- a/source/blender/editors/interface/interface_region_popup.cc +++ b/source/blender/editors/interface/interface_region_popup.cc @@ -116,18 +116,18 @@ static void ui_popup_block_position(wmWindow *window, const int center_x = (block->direction & UI_DIR_CENTER_X) ? size_x / 2 : 0; const int center_y = (block->direction & UI_DIR_CENTER_Y) ? size_y / 2 : 0; + const int win_x = WM_window_pixels_x(window); + const int win_y = WM_window_pixels_y(window); + + /* Take into account maximum size so we don't have to flip on refresh. */ + const float max_size_x = max_ff(size_x, handle->max_size_x); + const float max_size_y = max_ff(size_y, handle->max_size_y); + short dir1 = 0, dir2 = 0; if (!handle->refresh) { bool left = false, right = false, top = false, down = false; - const int win_x = WM_window_pixels_x(window); - const int win_y = WM_window_pixels_y(window); - - /* Take into account maximum size so we don't have to flip on refresh. */ - const float max_size_x = max_ff(size_x, handle->max_size_x); - const float max_size_y = max_ff(size_y, handle->max_size_y); - /* check if there's space at all */ if (butrct.xmin - max_size_x + center_x > 0.0f) { left = true; @@ -237,6 +237,15 @@ static void ui_popup_block_position(wmWindow *window, } else if (dir1 == UI_DIR_UP) { offset_y = (butrct.ymax - block->rect.ymin) - offset_overlap; + + if (but->type == UI_BTYPE_COLOR && block->rect.ymax + offset_y > win_y - UI_POPUP_MENU_TOP) { + /* Shift this down, aligning the top edge close to the window top. */ + offset_y = win_y - block->rect.ymax - UI_POPUP_MENU_TOP; + /* All four corners should be rounded since this no longer button-aligned. */ + block->direction = UI_DIR_CENTER_Y; + dir1 = UI_DIR_CENTER_Y; + } + if (dir2 == UI_DIR_RIGHT) { offset_x = butrct.xmax - block->rect.xmax + center_x; } @@ -251,6 +260,15 @@ static void ui_popup_block_position(wmWindow *window, } else if (dir1 == UI_DIR_DOWN) { offset_y = (butrct.ymin - block->rect.ymax) + offset_overlap; + + if (but->type == UI_BTYPE_COLOR && block->rect.ymin + offset_y < UI_SCREEN_MARGIN) { + /* Shift this up, aligning the bottom edge close to the window bottom. */ + offset_y = -block->rect.ymin + UI_SCREEN_MARGIN; + /* All four corners should be rounded since this no longer button-aligned. */ + block->direction = UI_DIR_CENTER_Y; + dir1 = UI_DIR_CENTER_Y; + } + if (dir2 == UI_DIR_RIGHT) { offset_x = butrct.xmax - block->rect.xmax + center_x; }