Fix T92313: Heading of redo panel is not aligned properly

This corrects some alignments issues through new margins introduced in
93544b641b. Basic idea of this fix is to only add the new margins when
drawing a panel with background. These margins were added specifically
for the background boxes, so that makes sense.

Alternative fix to D13199.

This also fixes some margings added unintentionally in mentioned commit.
There is a little jump of the toolbar and the tabs in the Properties
when comparing the UI without this fix to 2.93:
{F12158085} {F12158039}
The jump is gone with this fix applied (compare to the 2.93 screenshot):
{F12158064}
While not a serious issue, this confirms that this fix actually tackles
the root of the issue.
This commit is contained in:
Julian Eisel 2021-11-25 16:53:44 +01:00
parent 94e8db1e86
commit 5514ca58a4
Notes: blender-bot 2023-02-13 17:23:10 +01:00
Referenced by issue #92313, Heading of redo panel is not aligned properly
4 changed files with 45 additions and 18 deletions

View File

@ -257,6 +257,8 @@ enum {
#define UI_PANEL_CATEGORY_MARGIN_WIDTH (U.widget_unit * 1.0f)
/* Both these margins should be ignored if the panel doesn't show a background (check
* #UI_panel_should_show_background()). */
#define UI_PANEL_MARGIN_X (U.widget_unit * 0.4f)
#define UI_PANEL_MARGIN_Y (U.widget_unit * 0.1f)
@ -1771,6 +1773,8 @@ void UI_panel_context_pointer_set(struct Panel *panel, const char *name, struct
bool UI_panel_is_closed(const struct Panel *panel);
bool UI_panel_is_active(const struct Panel *panel);
void UI_panel_label_offset(const struct uiBlock *block, int *r_x, int *r_y);
bool UI_panel_should_show_background(const struct ARegion *region,
const struct PanelType *panel_type);
int UI_panel_size_y(const struct Panel *panel);
bool UI_panel_is_dragging(const struct Panel *panel);
bool UI_panel_matches_search_filter(const struct Panel *panel);

View File

@ -2075,24 +2075,11 @@ void UI_block_draw(const bContext *C, uiBlock *block)
ui_draw_menu_back(&style, block, &rect);
}
else if (block->panel) {
bool show_background = region->alignment != RGN_ALIGN_FLOAT;
if (show_background) {
if (block->panel->type && (block->panel->type->flag & PANEL_TYPE_NO_HEADER)) {
if (region->regiontype == RGN_TYPE_TOOLS) {
/* We never want a background around active tools. */
show_background = false;
}
else {
/* Without a header there is no background except for region overlap. */
show_background = region->overlap != 0;
}
}
}
ui_draw_aligned_panel(&style,
block,
&rect,
UI_panel_category_is_visible(region),
show_background,
UI_panel_should_show_background(region, block->panel->type),
region->flag & RGN_FLAG_SEARCH_FILTER_ACTIVE);
}

View File

@ -1334,6 +1334,26 @@ void ui_draw_aligned_panel(const uiStyle *style,
}
}
bool UI_panel_should_show_background(const ARegion *region, const PanelType *panel_type)
{
if (region->alignment == RGN_ALIGN_FLOAT) {
return false;
}
if (panel_type && panel_type->flag & PANEL_TYPE_NO_HEADER) {
if (region->regiontype == RGN_TYPE_TOOLS) {
/* We never want a background around active tools. */
return false;
}
else {
/* Without a header there is no background except for region overlap. */
return region->overlap != 0;
}
}
return true;
}
/** \} */
/* -------------------------------------------------------------------- */
@ -1746,17 +1766,22 @@ static bool uiAlignPanelStep(ARegion *region, const float factor, const bool dra
const int region_offset_x = panel_region_offset_x_get(region);
for (int i = 0; i < active_panels_len; i++) {
PanelSort *ps = &panel_sort[i];
const bool no_header = ps->panel->type->flag & PANEL_TYPE_NO_HEADER;
const bool show_background = UI_panel_should_show_background(region, ps->panel->type);
ps->panel->runtime.region_ofsx = region_offset_x;
ps->new_offset_x = region_offset_x + (no_header ? 0 : UI_PANEL_MARGIN_X);
ps->new_offset_x = region_offset_x + (show_background ? UI_PANEL_MARGIN_X : 0);
}
/* Y offset. */
for (int i = 0, y = 0; i < active_panels_len; i++) {
PanelSort *ps = &panel_sort[i];
const bool show_background = UI_panel_should_show_background(region, ps->panel->type);
y -= get_panel_real_size_y(ps->panel);
y -= UI_PANEL_MARGIN_Y;
/* Separate panel boxes a bit further (if they are drawn). */
if (show_background) {
y -= UI_PANEL_MARGIN_Y;
}
ps->new_offset_y = y;
/* The header still draws offset by the size of closed panels, so apply the offset here. */
if (UI_panel_is_closed(ps->panel)) {

View File

@ -2934,6 +2934,16 @@ static const char *region_panels_collect_categories(ARegion *region,
return NULL;
}
static int panel_draw_width_from_max_width_get(const ARegion *region,
const PanelType *panel_type,
const int max_width)
{
/* With a background, we want some extra padding. */
return UI_panel_should_show_background(region, panel_type) ?
max_width - UI_PANEL_MARGIN_X * 2.0f :
max_width;
}
/**
* \param contexts: A NULL terminated array of context strings to match against.
* Matching against any of these strings will draw the panel.
@ -2982,7 +2992,6 @@ void ED_region_panels_layout_ex(const bContext *C,
}
const int width_no_header = BLI_rctf_size_x(&v2d->cur) - margin_x;
const int width = width_no_header - UI_PANEL_MARGIN_X * 2.0f;
/* Works out to 10 * UI_UNIT_X or 20 * UI_UNIT_X. */
const int em = (region->type->prefsizex) ? 10 : 20;
@ -3010,6 +3019,7 @@ void ED_region_panels_layout_ex(const bContext *C,
continue;
}
}
const int width = panel_draw_width_from_max_width_get(region, pt, width_no_header);
if (panel && UI_panel_is_dragging(panel)) {
/* Prevent View2d.tot rectangle size changes while dragging panels. */
@ -3040,6 +3050,7 @@ void ED_region_panels_layout_ex(const bContext *C,
!STREQ(category, panel->type->category)) {
continue;
}
const int width = panel_draw_width_from_max_width_get(region, panel->type, width_no_header);
if (panel && UI_panel_is_dragging(panel)) {
/* Prevent View2d.tot rectangle size changes while dragging panels. */