UI: Color Picker Positioning #106122
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue