Fix popups opening in the wrong direction over headers
Checks for header alignment didn't account for tool-header & header having different alignment. There is no reason to use a lookup function on the area (ED_area_header_alignment) as we already have region. Check the regions alignment directly, remove access functions.
This commit is contained in:
@@ -187,11 +187,7 @@ void ED_area_newspace(struct bContext *C, ScrArea *area, int type, const bool sk
|
||||
void ED_area_prevspace(struct bContext *C, ScrArea *area);
|
||||
void ED_area_swapspace(struct bContext *C, ScrArea *sa1, ScrArea *sa2);
|
||||
int ED_area_headersize(void);
|
||||
int ED_area_header_alignment_or_fallback(const ScrArea *area, int fallback);
|
||||
int ED_area_header_alignment(const ScrArea *area);
|
||||
int ED_area_footersize(void);
|
||||
int ED_area_footer_alignment_or_fallback(const ScrArea *area, int fallback);
|
||||
int ED_area_footer_alignment(const ScrArea *area);
|
||||
int ED_area_global_size_y(const ScrArea *area);
|
||||
int ED_area_global_min_size_y(const ScrArea *area);
|
||||
int ED_area_global_max_size_y(const ScrArea *area);
|
||||
|
||||
@@ -284,17 +284,10 @@ static uiBlock *ui_block_func_POPUP(bContext *C, uiPopupBlockHandle *handle, voi
|
||||
else {
|
||||
/* for a header menu we set the direction automatic */
|
||||
if (!pup->slideout && flip) {
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
ARegion *region = CTX_wm_region(C);
|
||||
if (area && region) {
|
||||
if (ELEM(region->regiontype, RGN_TYPE_HEADER, RGN_TYPE_TOOL_HEADER)) {
|
||||
if (RGN_ALIGN_ENUM_FROM_MASK(ED_area_header_alignment(area)) == RGN_ALIGN_BOTTOM) {
|
||||
UI_block_direction_set(block, UI_DIR_UP);
|
||||
UI_block_order_flip(block);
|
||||
}
|
||||
}
|
||||
if (region->regiontype == RGN_TYPE_FOOTER) {
|
||||
if (RGN_ALIGN_ENUM_FROM_MASK(ED_area_footer_alignment(area)) == RGN_ALIGN_BOTTOM) {
|
||||
if (region) {
|
||||
if (RGN_TYPE_IS_HEADER_ANY(region->regiontype)) {
|
||||
if (RGN_ALIGN_ENUM_FROM_MASK(region->alignment) == RGN_ALIGN_BOTTOM) {
|
||||
UI_block_direction_set(block, UI_DIR_UP);
|
||||
UI_block_order_flip(block);
|
||||
}
|
||||
|
||||
@@ -171,7 +171,6 @@ static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, v
|
||||
}
|
||||
|
||||
if (!slideout) {
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
ARegion *region = CTX_wm_region(C);
|
||||
|
||||
if (region && region->panels.first) {
|
||||
@@ -180,14 +179,9 @@ static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, v
|
||||
UI_block_direction_set(block, UI_DIR_UP | UI_DIR_CENTER_X);
|
||||
}
|
||||
/* Prefer popover from header to be positioned into the editor. */
|
||||
else if (area && region) {
|
||||
if (ELEM(region->regiontype, RGN_TYPE_HEADER, RGN_TYPE_TOOL_HEADER)) {
|
||||
if (RGN_ALIGN_ENUM_FROM_MASK(ED_area_header_alignment(area)) == RGN_ALIGN_BOTTOM) {
|
||||
UI_block_direction_set(block, UI_DIR_UP | UI_DIR_CENTER_X);
|
||||
}
|
||||
}
|
||||
if (region->regiontype == RGN_TYPE_FOOTER) {
|
||||
if (RGN_ALIGN_ENUM_FROM_MASK(ED_area_footer_alignment(area)) == RGN_ALIGN_BOTTOM) {
|
||||
else if (region) {
|
||||
if (RGN_TYPE_IS_HEADER_ANY(region->regiontype)) {
|
||||
if (RGN_ALIGN_ENUM_FROM_MASK(region->alignment) == RGN_ALIGN_BOTTOM) {
|
||||
UI_block_direction_set(block, UI_DIR_UP | UI_DIR_CENTER_X);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3159,43 +3159,11 @@ int ED_area_headersize(void)
|
||||
return U.widget_unit + (int)(UI_DPI_FAC * HEADER_PADDING_Y);
|
||||
}
|
||||
|
||||
int ED_area_header_alignment_or_fallback(const ScrArea *area, int fallback)
|
||||
{
|
||||
LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
|
||||
if (region->regiontype == RGN_TYPE_HEADER) {
|
||||
return region->alignment;
|
||||
}
|
||||
}
|
||||
return fallback;
|
||||
}
|
||||
|
||||
int ED_area_header_alignment(const ScrArea *area)
|
||||
{
|
||||
return ED_area_header_alignment_or_fallback(
|
||||
area, (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM : RGN_ALIGN_TOP);
|
||||
}
|
||||
|
||||
int ED_area_footersize(void)
|
||||
{
|
||||
return ED_area_headersize();
|
||||
}
|
||||
|
||||
int ED_area_footer_alignment_or_fallback(const ScrArea *area, int fallback)
|
||||
{
|
||||
LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
|
||||
if (region->regiontype == RGN_TYPE_FOOTER) {
|
||||
return region->alignment;
|
||||
}
|
||||
}
|
||||
return fallback;
|
||||
}
|
||||
|
||||
int ED_area_footer_alignment(const ScrArea *area)
|
||||
{
|
||||
return ED_area_footer_alignment_or_fallback(
|
||||
area, (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_TOP : RGN_ALIGN_BOTTOM);
|
||||
}
|
||||
|
||||
/**
|
||||
* \return the final height of a global \a area, accounting for DPI.
|
||||
*/
|
||||
|
||||
@@ -645,6 +645,11 @@ typedef enum eRegionType {
|
||||
/* Region supports panel tabs (categories). */
|
||||
#define RGN_TYPE_HAS_CATEGORY_MASK (1 << RGN_TYPE_UI)
|
||||
|
||||
/* Check for any kind of header region. */
|
||||
#define RGN_TYPE_IS_HEADER_ANY(regiontype) \
|
||||
(((1 << (regiontype)) & \
|
||||
((1 << RGN_TYPE_HEADER) | 1 << (RGN_TYPE_TOOL_HEADER) | (1 << RGN_TYPE_FOOTER))) != 0)
|
||||
|
||||
/** #ARegion.alignment */
|
||||
enum {
|
||||
RGN_ALIGN_NONE = 0,
|
||||
|
||||
@@ -1363,8 +1363,7 @@ static int wm_operator_invoke(bContext *C,
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
|
||||
/* Wrap only in X for header. */
|
||||
if (region &&
|
||||
ELEM(region->regiontype, RGN_TYPE_HEADER, RGN_TYPE_TOOL_HEADER, RGN_TYPE_FOOTER)) {
|
||||
if (region && RGN_TYPE_IS_HEADER_ANY(region->regiontype)) {
|
||||
wrap = WM_CURSOR_WRAP_X;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user