Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/screen/screen_edit.c
| Show First 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | |||||
| /* Close a screen area, allowing any neighbor to take its place. */ | /* Close a screen area, allowing any neighbor to take its place. */ | ||||
| bool screen_area_close(struct bContext *C, bScreen *screen, ScrArea *area) | bool screen_area_close(struct bContext *C, bScreen *screen, ScrArea *area) | ||||
| { | { | ||||
| if (area == NULL) { | if (area == NULL) { | ||||
| return false; | return false; | ||||
| } | } | ||||
| ScrArea *sa2 = NULL; | ScrArea *sa2 = NULL; | ||||
| float max_alignment = 0; | |||||
| /* Find the most-aligned joinable area. Larger size breaks ties. */ | |||||
| int min_alignment = INT_MAX; | /* Find the most-aligned joinable area. */ | ||||
| int max_size = 0; | LISTBASE_FOREACH (ScrArea *, neighbor, &screen->areabase) { | ||||
| LISTBASE_FOREACH (ScrArea *, ar, &screen->areabase) { | int dir = area_getorientation(area, neighbor); | ||||
| int dir = area_getorientation(area, ar); | if (dir != -1 && !neighbor->global) { | ||||
| if (dir != -1) { | /* Compare adjoining lengths. Use verts as winx/winy might not be updated yet. */ | ||||
| int offset1; | int area_length = ELEM(dir, 1, 3) ? area->v3->vec.x - area->v1->vec.x : | ||||
| int offset2; | area->v3->vec.y - area->v1->vec.y; | ||||
| area_getoffsets(area, ar, dir, &offset1, &offset2); | int ar_length = ELEM(dir, 1, 3) ? neighbor->v3->vec.x - neighbor->v1->vec.x : | ||||
| int area_alignment = abs(offset1) + abs(offset2); | neighbor->v3->vec.y - neighbor->v1->vec.y; | ||||
| if (area_alignment < min_alignment) { | float alignment = area_length / (float)ar_length; | ||||
| min_alignment = area_alignment; | alignment = (alignment > 1.0f) ? 1.0f / alignment : alignment; | ||||
| max_size = ar->winx * ar->winy; | if (alignment > max_alignment) { | ||||
| sa2 = ar; | max_alignment = alignment; | ||||
| } | sa2 = neighbor; | ||||
| else if (area_alignment == min_alignment) { | |||||
| int area_size = ar->winx * ar->winy; | |||||
| if (area_size > max_size) { | |||||
| max_size = area_size; | |||||
| sa2 = ar; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return screen_area_join_ex(C, screen, sa2, area, true); | return screen_area_join_ex(C, screen, sa2, area, true); | ||||
| } | } | ||||
| /* ****************** EXPORTED API TO OTHER MODULES *************************** */ | /* ****************** EXPORTED API TO OTHER MODULES *************************** */ | ||||
| ▲ Show 20 Lines • Show All 92 Lines • Show Last 20 Lines | |||||