Merge branch 'blender-v3.0-release'
This commit is contained in:
commit
4a3f99ad5a
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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, ®ion->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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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. */
|
||||
|
|
Loading…
Reference in New Issue