UI: Fix odd behavior in region sizing, simplify code
* When resizing sidebars, don't collapse when the region becomes too big but instead clamp the region size to the available space. * Fix clicking the tab to expand sidebars no working if the sidebar is too wide to fit. Instead make it less wide so it does fit. * Fix incorrect limit on tool properties region height, for example in the file browser. Differential Revision: https://developer.blender.org/D4611
This commit is contained in:
@@ -985,17 +985,7 @@ static void region_azones_add(const bScreen *screen, ScrArea *sa, ARegion *ar, c
|
||||
const bool is_fullscreen = screen->state == SCREENFULL;
|
||||
|
||||
/* edge code (t b l r) is along which area edge azone will be drawn */
|
||||
|
||||
if (ar->regiontype == RGN_TYPE_HEADER && ar->winy + 6 > sa->winy) {
|
||||
/* The logic for this is: when the header takes up the full area,
|
||||
* disallow hiding it to view the main window.
|
||||
*
|
||||
* Without this, you can drag down the file selectors header and hide it
|
||||
* by accident very easily (highly annoying!), the value 6 is arbitrary
|
||||
* but accounts for small common rounding problems when scaling the UI,
|
||||
* must be minimum '4' */
|
||||
}
|
||||
else if (alignment == RGN_ALIGN_TOP)
|
||||
if (alignment == RGN_ALIGN_TOP)
|
||||
region_azone_edge_initialize(sa, ar, AE_BOTTOM_TO_TOPLEFT, is_fullscreen);
|
||||
else if (alignment == RGN_ALIGN_BOTTOM)
|
||||
region_azone_edge_initialize(sa, ar, AE_TOP_TO_BOTTOMRIGHT, is_fullscreen);
|
||||
|
@@ -2278,12 +2278,25 @@ typedef struct RegionMoveData {
|
||||
|
||||
} RegionMoveData;
|
||||
|
||||
|
||||
static int area_max_regionsize(ScrArea *sa, ARegion *scalear, AZEdge edge)
|
||||
{
|
||||
ARegion *ar;
|
||||
int dist;
|
||||
|
||||
/* regions in regions. */
|
||||
if (scalear->alignment & RGN_SPLIT_PREV) {
|
||||
const int align = scalear->alignment & RGN_ALIGN_ENUM_MASK;
|
||||
|
||||
if (ELEM(align, RGN_ALIGN_TOP, RGN_ALIGN_BOTTOM)) {
|
||||
ar = scalear->prev;
|
||||
dist = ar->winy + scalear->winy - U.pixelsize;
|
||||
}
|
||||
else if (ELEM(align, RGN_ALIGN_LEFT, RGN_ALIGN_RIGHT)) {
|
||||
ar = scalear->prev;
|
||||
dist = ar->winx + scalear->winx - U.pixelsize;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (edge == AE_RIGHT_TO_TOPLEFT || edge == AE_LEFT_TO_TOPRIGHT) {
|
||||
dist = BLI_rcti_size_x(&sa->totrct);
|
||||
}
|
||||
@@ -2297,29 +2310,24 @@ static int area_max_regionsize(ScrArea *sa, ARegion *scalear, AZEdge edge)
|
||||
if (ar == scalear)
|
||||
continue;
|
||||
|
||||
if (scalear->alignment == RGN_ALIGN_TOP && ar->alignment == RGN_ALIGN_BOTTOM)
|
||||
dist -= ar->winy;
|
||||
else if (scalear->alignment == RGN_ALIGN_BOTTOM && ar->alignment == RGN_ALIGN_TOP)
|
||||
dist -= ar->winy;
|
||||
else if (scalear->alignment == RGN_ALIGN_LEFT && ar->alignment == RGN_ALIGN_RIGHT)
|
||||
if (scalear->alignment == RGN_ALIGN_LEFT && ar->alignment == RGN_ALIGN_RIGHT) {
|
||||
dist -= ar->winx;
|
||||
else if (scalear->alignment == RGN_ALIGN_RIGHT && ar->alignment == RGN_ALIGN_LEFT)
|
||||
}
|
||||
else if (scalear->alignment == RGN_ALIGN_RIGHT && ar->alignment == RGN_ALIGN_LEFT) {
|
||||
dist -= ar->winx;
|
||||
|
||||
/* case of regions in regions, like operator properties panel */
|
||||
/* these can sit on top of other regions such as headers, so account for this */
|
||||
else if (edge == AE_BOTTOM_TO_TOPLEFT && scalear->alignment & RGN_ALIGN_TOP &&
|
||||
ar->alignment == RGN_ALIGN_TOP && ar->regiontype == RGN_TYPE_HEADER)
|
||||
{
|
||||
}
|
||||
else if (scalear->alignment == RGN_ALIGN_TOP &&
|
||||
(ar->alignment == RGN_ALIGN_BOTTOM || ar->regiontype == RGN_TYPE_HEADER)) {
|
||||
dist -= ar->winy;
|
||||
}
|
||||
else if (edge == AE_TOP_TO_BOTTOMRIGHT && scalear->alignment & RGN_ALIGN_BOTTOM &&
|
||||
ar->alignment == RGN_ALIGN_BOTTOM && ar->regiontype == RGN_TYPE_HEADER)
|
||||
{
|
||||
else if (scalear->alignment == RGN_ALIGN_BOTTOM &&
|
||||
(ar->alignment == RGN_ALIGN_TOP || ar->regiontype == RGN_TYPE_HEADER)) {
|
||||
dist -= ar->winy;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dist /= UI_DPI_FAC;
|
||||
return dist;
|
||||
}
|
||||
|
||||
@@ -2337,7 +2345,6 @@ static int region_scale_invoke(bContext *C, wmOperator *op, const wmEvent *event
|
||||
|
||||
if (az->ar) {
|
||||
RegionMoveData *rmd = MEM_callocN(sizeof(RegionMoveData), "RegionMoveData");
|
||||
int maxsize;
|
||||
|
||||
op->customdata = rmd;
|
||||
|
||||
@@ -2363,13 +2370,7 @@ static int region_scale_invoke(bContext *C, wmOperator *op, const wmEvent *event
|
||||
rmd->origval = rmd->ar->sizey;
|
||||
}
|
||||
|
||||
/* limit headers to standard height for now */
|
||||
if (rmd->ar->regiontype == RGN_TYPE_HEADER)
|
||||
maxsize = ED_area_headersize();
|
||||
else
|
||||
maxsize = 1000;
|
||||
|
||||
CLAMP(rmd->maxsize, 0, maxsize);
|
||||
CLAMP(rmd->maxsize, 0, 1000);
|
||||
|
||||
/* add temp handler */
|
||||
WM_event_add_modal_handler(C, op);
|
||||
@@ -2380,24 +2381,6 @@ static int region_scale_invoke(bContext *C, wmOperator *op, const wmEvent *event
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
static int region_scale_get_maxsize(RegionMoveData *rmd)
|
||||
{
|
||||
int maxsize = 0;
|
||||
|
||||
if (rmd->edge == AE_LEFT_TO_TOPRIGHT || rmd->edge == AE_RIGHT_TO_TOPLEFT) {
|
||||
return (int) ( (rmd->sa->winx / UI_DPI_FAC) - UI_UNIT_X);
|
||||
}
|
||||
|
||||
if (rmd->ar->regiontype == RGN_TYPE_TOOL_PROPS) {
|
||||
/* this calculation seems overly verbose
|
||||
* can someone explain why this method is necessary? - campbell */
|
||||
const bool top_header = ED_area_header_alignment(rmd->sa) == RGN_ALIGN_TOP;
|
||||
maxsize = rmd->maxsize - ((top_header) ? UI_UNIT_Y * 2 : UI_UNIT_Y) - (UI_UNIT_Y / 4);
|
||||
}
|
||||
|
||||
return maxsize;
|
||||
}
|
||||
|
||||
static void region_scale_validate_size(RegionMoveData *rmd)
|
||||
{
|
||||
if ((rmd->ar->flag & RGN_FLAG_HIDDEN) == 0) {
|
||||
@@ -2409,7 +2392,7 @@ static void region_scale_validate_size(RegionMoveData *rmd)
|
||||
else
|
||||
size = &rmd->ar->sizey;
|
||||
|
||||
maxsize = region_scale_get_maxsize(rmd);
|
||||
maxsize = rmd->maxsize - (UI_UNIT_Y / UI_DPI_FAC);
|
||||
|
||||
if (*size > maxsize && maxsize > 0)
|
||||
*size = maxsize;
|
||||
@@ -2469,7 +2452,6 @@ static int region_scale_modal(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
}
|
||||
}
|
||||
else {
|
||||
int maxsize = region_scale_get_maxsize(rmd);
|
||||
delta = event->y - rmd->origy;
|
||||
if (rmd->edge == AE_BOTTOM_TO_TOPLEFT) delta = -delta;
|
||||
|
||||
@@ -2494,9 +2476,6 @@ static int region_scale_modal(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
if (!(rmd->ar->flag & RGN_FLAG_HIDDEN))
|
||||
region_scale_toggle_hidden(C, rmd);
|
||||
}
|
||||
else if (maxsize > 0 && (rmd->ar->sizey > maxsize)) {
|
||||
rmd->ar->sizey = maxsize;
|
||||
}
|
||||
else if (rmd->ar->flag & RGN_FLAG_HIDDEN) {
|
||||
region_scale_toggle_hidden(C, rmd);
|
||||
}
|
||||
|
@@ -609,6 +609,7 @@ enum {
|
||||
#define RGN_ALIGN_VSPLIT 6
|
||||
#define RGN_ALIGN_FLOAT 7
|
||||
#define RGN_ALIGN_QSPLIT 8
|
||||
#define RGN_ALIGN_ENUM_MASK 0x0F
|
||||
|
||||
#define RGN_SPLIT_PREV 32
|
||||
|
||||
|
Reference in New Issue
Block a user