From 99c970a94dcfeeab047ae57ba1e4a64032f120f9 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Wed, 16 Nov 2022 09:51:40 -0800 Subject: [PATCH] UI: Allow Joining of Tiny Screen Areas Allow joining of areas that are below our minimum sizes. See D16522 for more details. Differential Revision: https://developer.blender.org/D16522 Reviewed by Campbell Barton --- source/blender/editors/screen/screen_edit.c | 54 ++++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index b2ec251697e..14ed5987cc7 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -268,35 +268,35 @@ eScreenDir area_getorientation(ScrArea *sa_a, ScrArea *sa_b) return SCREEN_DIR_NONE; } - const vec2s *sa_bl = &sa_a->v1->vec; - const vec2s *sa_tl = &sa_a->v2->vec; - const vec2s *sa_tr = &sa_a->v3->vec; - const vec2s *sa_br = &sa_a->v4->vec; + short left_a = sa_a->v1->vec.x; + short right_a = sa_a->v3->vec.x; + short top_a = sa_a->v3->vec.y; + short bottom_a = sa_a->v1->vec.y; - const vec2s *sb_bl = &sa_b->v1->vec; - const vec2s *sb_tl = &sa_b->v2->vec; - const vec2s *sb_tr = &sa_b->v3->vec; - const vec2s *sb_br = &sa_b->v4->vec; + short left_b = sa_b->v1->vec.x; + short right_b = sa_b->v3->vec.x; + short top_b = sa_b->v3->vec.y; + short bottom_b = sa_b->v1->vec.y; - if (sa_bl->x == sb_br->x && sa_tl->x == sb_tr->x) { /* sa_a to right of sa_b = W */ - if ((MIN2(sa_tl->y, sb_tr->y) - MAX2(sa_bl->y, sb_br->y)) > AREAJOINTOLERANCEY) { - return 0; - } + /* How much these areas share a common edge. */ + short overlapx = MIN2(right_a, right_b) - MAX2(left_a, left_b); + short overlapy = MIN2(top_a, top_b) - MAX2(bottom_a, bottom_b); + + /* Minimum overlap required. */ + const short minx = MIN3(AREAJOINTOLERANCEX, right_a - left_a, right_b - left_b); + const short miny = MIN3(AREAJOINTOLERANCEY, top_a - bottom_a, top_b - bottom_b); + + if (top_a == bottom_b && overlapx >= minx) { + return 1; /* sa_a to bottom of sa_b = N */ } - else if (sa_tl->y == sb_bl->y && sa_tr->y == sb_br->y) { /* sa_a to bottom of sa_b = N */ - if ((MIN2(sa_tr->x, sb_br->x) - MAX2(sa_tl->x, sb_bl->x)) > AREAJOINTOLERANCEX) { - return 1; - } + if (bottom_a == top_b && overlapx >= minx) { + return 3; /* sa_a on top of sa_b = S */ } - else if (sa_tr->x == sb_tl->x && sa_br->x == sb_bl->x) { /* sa_a to left of sa_b = E */ - if ((MIN2(sa_tr->y, sb_tl->y) - MAX2(sa_br->y, sb_bl->y)) > AREAJOINTOLERANCEY) { - return 2; - } + if (left_a == right_b && overlapy >= miny) { + return 0; /* sa_a to right of sa_b = W */ } - else if (sa_bl->y == sb_tl->y && sa_br->y == sb_tr->y) { /* sa_a on top of sa_b = S */ - if ((MIN2(sa_br->x, sb_tr->x) - MAX2(sa_bl->x, sb_tl->x)) > AREAJOINTOLERANCEX) { - return 3; - } + if (right_a == left_b && overlapy >= miny) { + return 2; /* sa_a to left of sa_b = E */ } return -1; @@ -382,6 +382,9 @@ static bool screen_areas_can_align(bScreen *screen, ScrArea *sa1, ScrArea *sa2, const short xmin = MIN2(sa1->v1->vec.x, sa2->v1->vec.x); const short xmax = MAX2(sa1->v3->vec.x, sa2->v3->vec.x); LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + if (area == sa1 || area == sa2) { + continue; + } if (area->v3->vec.x - area->v1->vec.x < tolerance && (area->v1->vec.x == xmin || area->v3->vec.x == xmax)) { /* There is a narrow vertical area sharing an edge of the combined bounds. */ @@ -393,6 +396,9 @@ static bool screen_areas_can_align(bScreen *screen, ScrArea *sa1, ScrArea *sa2, const short ymin = MIN2(sa1->v1->vec.y, sa2->v1->vec.y); const short ymax = MAX2(sa1->v3->vec.y, sa2->v3->vec.y); LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + if (area == sa1 || area == sa2) { + continue; + } if (area->v3->vec.y - area->v1->vec.y < tolerance && (area->v1->vec.y == ymin || area->v3->vec.y == ymax)) { /* There is a narrow horizontal area sharing an edge of the combined bounds. */