diff options
author | Julian Eisel <julian@blender.org> | 2021-11-25 19:26:53 +0300 |
---|---|---|
committer | Julian Eisel <julian@blender.org> | 2021-11-25 19:26:53 +0300 |
commit | 4a3f99ad5a2e6e87156baa5c6f2184df8ea09683 (patch) | |
tree | 295575c89f2435f8a74ca99a7a2d2d9430f81421 | |
parent | 3652f5f758aafa2103519c3c0663ba8643b554c1 (diff) | |
parent | 5a11c6e558c6581cc07d2a1d67db460241255f09 (diff) |
Merge branch 'blender-v3.0-release'
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 4 | ||||
-rw-r--r-- | source/blender/editors/interface/interface.c | 15 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_panel.c | 40 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_widgets.c | 40 | ||||
-rw-r--r-- | source/blender/editors/screen/area.c | 13 |
5 files changed, 91 insertions, 21 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 29d031ba13d..1dbb486ad72 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -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); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 55fab04e9a4..b9f68d8d83c 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -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); } diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 18fa620f0d9..3c937c545ea 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -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; diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 911f1bfc90d..7c24463fe5b 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -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); diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 38eadf95bde..0190e7b7cee 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -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. */ |