Merge branch 'blender-v3.0-release'

This commit is contained in:
Julian Eisel 2021-11-25 17:26:53 +01:00
commit 4a3f99ad5a
5 changed files with 91 additions and 21 deletions

View File

@ -258,6 +258,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)
@ -1767,6 +1769,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

@ -2062,24 +2062,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)) {
@ -1802,6 +1827,7 @@ static void ui_panels_size(ARegion *region, int *r_x, int *r_y)
{
int sizex = 0;
int sizey = 0;
bool has_panel_with_background = false;
/* Compute size taken up by panels, for setting in view2d. */
LISTBASE_FOREACH (Panel *, panel, &region->panels) {
@ -1811,6 +1837,9 @@ static void ui_panels_size(ARegion *region, int *r_x, int *r_y)
sizex = max_ii(sizex, pa_sizex);
sizey = min_ii(sizey, pa_sizey);
if (UI_panel_should_show_background(region, panel->type)) {
has_panel_with_background = true;
}
}
}
@ -1820,6 +1849,11 @@ static void ui_panels_size(ARegion *region, int *r_x, int *r_y)
if (sizey == 0) {
sizey = -UI_PANEL_WIDTH;
}
/* Extra margin after the list so the view scrolls a few pixels further than the panel border.
* Also makes the bottom match the top margin. */
if (has_panel_with_background) {
sizey -= UI_PANEL_MARGIN_Y;
}
*r_x = sizex;
*r_y = sizey;

View File

@ -101,6 +101,10 @@ typedef enum {
UI_WTYPE_PULLDOWN,
UI_WTYPE_MENU_ITEM,
/* Same as #UI_WTYPE_MENU_ITEM, but doesn't add padding to sides for text & icon inside the
* widget. To be used when multiple menu items should be displayed close to each other
* horizontally. */
UI_WTYPE_MENU_ITEM_UNPADDED,
UI_WTYPE_MENU_ITEM_RADIAL,
UI_WTYPE_MENU_BACK,
@ -4081,6 +4085,27 @@ static void widget_menu_itembut(uiWidgetColors *wcol,
widgetbase_draw(&wtb, wcol);
}
static void widget_menu_itembut_unpadded(uiWidgetColors *wcol,
rcti *rect,
int UNUSED(state),
int UNUSED(roundboxalign),
const float zoom)
{
/* This function is used for menu items placed close to each other horizontally, e.g. the matcap
* preview popup or the row of collection color icons in the Outliner context menu. Don't use
* padding on the sides like the normal menu item. */
uiWidgetBase wtb;
widget_init(&wtb);
/* No outline. */
wtb.draw_outline = false;
const float rad = widget_radius_from_zoom(zoom, wcol);
round_box_edges(&wtb, UI_CNR_ALL, rect, rad);
widgetbase_draw(&wtb, wcol);
}
static void widget_menu_radial_itembut(uiBut *but,
uiWidgetColors *wcol,
rcti *rect,
@ -4486,6 +4511,12 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type)
wt.state = widget_state_menu_item;
break;
case UI_WTYPE_MENU_ITEM_UNPADDED:
wt.wcol_theme = &btheme->tui.wcol_menu_item;
wt.draw = widget_menu_itembut_unpadded;
wt.state = widget_state_menu_item;
break;
case UI_WTYPE_MENU_BACK:
wt.wcol_theme = &btheme->tui.wcol_menu_back;
wt.draw = widget_menu_back;
@ -4648,9 +4679,12 @@ void ui_draw_but(const bContext *C, struct ARegion *region, uiStyle *style, uiBu
case UI_BTYPE_SEPR_LINE:
ui_draw_separator(rect, &tui->wcol_menu_item);
break;
default:
wt = widget_type(UI_WTYPE_MENU_ITEM);
default: {
const bool use_unpadded = (but->flag & UI_BUT_ICON_PREVIEW) ||
((but->flag & UI_HAS_ICON) && !but->drawstr[0]);
wt = widget_type(use_unpadded ? UI_WTYPE_MENU_ITEM_UNPADDED : UI_WTYPE_MENU_ITEM);
break;
}
}
}
else if (ELEM(but->emboss, UI_EMBOSS_NONE, UI_EMBOSS_NONE_OR_STATUS)) {
@ -5526,7 +5560,7 @@ void ui_draw_preview_item(const uiFontStyle *fstyle,
int state,
eFontStyle_Align text_align)
{
uiWidgetType *wt = widget_type(UI_WTYPE_MENU_ITEM);
uiWidgetType *wt = widget_type(UI_WTYPE_MENU_ITEM_UNPADDED);
/* drawing button background */
wt->state(wt, state, 0, UI_EMBOSS_UNDEFINED);

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. */