diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index c8568da6ef8..48b0194e510 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -2286,9 +2286,15 @@ void UI_block_draw(const bContext *C, uiBlock *block) continue; } + /* Don't draw buttons that are wider than available space. */ + const int width = BLI_rcti_size_x(&rect); + if ((width > U.widget_unit * 2.5f / block->aspect) && width > region->winx) { + continue; + } + /* XXX: figure out why invalid coordinates happen when closing render window */ /* and material preview is redrawn in main window (temp fix for bug #23848) */ - if (rect.xmin < rect.xmax && rect.ymin < rect.ymax) { + if (rect.xmin >= 0 && rect.xmin < rect.xmax && rect.ymin < rect.ymax) { ui_draw_but(C, region, &style, but.get(), &rect); } } diff --git a/source/blender/editors/interface/interface_panel.cc b/source/blender/editors/interface/interface_panel.cc index 9ff05a8ee82..32f32b4fd73 100644 --- a/source/blender/editors/interface/interface_panel.cc +++ b/source/blender/editors/interface/interface_panel.cc @@ -1107,6 +1107,7 @@ static void panel_draw_aligned_widgets(const uiStyle *style, const uiFontStyle *fontstyle = (is_subpanel) ? &style->widget : &style->paneltitle; const int header_height = BLI_rcti_size_y(header_rect); + const int header_width = BLI_rcti_size_x(header_rect); const int scaled_unit = round_fl_to_int(UI_UNIT_X / aspect); /* Offset triangle and text to the right for sub-panels. */ @@ -1124,11 +1125,16 @@ static void panel_draw_aligned_widgets(const uiStyle *style, { const float size_y = BLI_rcti_size_y(&widget_rect); GPU_blend(GPU_BLEND_ALPHA); + float alpha = 0.8f; + /* Dim as its space is reduced to zero. */ + if (header_width < (scaled_unit * 4)) { + alpha *= std::max(float(header_width - scaled_unit) / float(scaled_unit * 3), 0.0f); + } UI_icon_draw_ex(widget_rect.xmin + size_y * 0.2f, widget_rect.ymin + size_y * (UI_panel_is_closed(panel) ? 0.17f : 0.14f), UI_panel_is_closed(panel) ? ICON_RIGHTARROW : ICON_DOWNARROW_HLT, aspect * UI_INV_SCALE_FAC, - 0.8f, + alpha, 0.0f, title_color, false, @@ -1140,7 +1146,7 @@ static void panel_draw_aligned_widgets(const uiStyle *style, if (panel->drawname && panel->drawname[0] != '\0') { rcti title_rect; title_rect.xmin = widget_rect.xmin + (panel->labelofs / aspect) + scaled_unit * 1.1f; - title_rect.xmax = widget_rect.xmax; + title_rect.xmax = widget_rect.xmax - scaled_unit; title_rect.ymin = widget_rect.ymin - 2.0f / aspect; title_rect.ymax = widget_rect.ymax; @@ -1172,7 +1178,10 @@ static void panel_draw_aligned_widgets(const uiStyle *style, const bool is_pin = panel_custom_pin_to_last_get(panel); const int icon = is_pin ? ICON_PINNED : ICON_GRIP; const float size = aspect * UI_INV_SCALE_FAC; - const float alpha = is_pin ? 1.0f : 0.5f; + float alpha = is_pin ? 1.0f : 0.5f; + if (header_width < (scaled_unit * 5)) { + alpha *= std::max((header_width - scaled_unit) / float(scaled_unit * 4), 0.0f); + } UI_icon_draw_ex(x, y, icon, size, alpha, 0.0f, title_color, false, UI_NO_ICON_OVERLAY_TEXT); } } diff --git a/source/blender/editors/interface/interface_widgets.cc b/source/blender/editors/interface/interface_widgets.cc index 34b534bdc5e..3590bcd8bd9 100644 --- a/source/blender/editors/interface/interface_widgets.cc +++ b/source/blender/editors/interface/interface_widgets.cc @@ -904,6 +904,10 @@ static void shape_preset_trias_from_rect_menu(uiWidgetTrias *tria, const rcti *r { const float width = BLI_rcti_size_x(rect); const float height = BLI_rcti_size_y(rect); + if ((width / height) < 0.5f) { + /* Too narrow to fit. */ + return; + } float centx, centy, size; tria->type = ROUNDBOX_TRIA_MENU; @@ -1341,6 +1345,11 @@ static void widget_draw_icon( alpha *= widget_alpha_factor(&state); } + /* Dim the icon as its space is reduced to zero. */ + if (height > (rect->xmax - rect->xmin)) { + alpha *= std::max(float(rect->xmax - rect->xmin) / height, 0.0f); + } + GPU_blend(GPU_BLEND_ALPHA); if (icon && icon != ICON_BLANK1) { diff --git a/source/blender/editors/interface/views/tree_view.cc b/source/blender/editors/interface/views/tree_view.cc index 7ae206b1e57..b2d4167575c 100644 --- a/source/blender/editors/interface/views/tree_view.cc +++ b/source/blender/editors/interface/views/tree_view.cc @@ -898,6 +898,12 @@ void TreeViewLayoutBuilder::build_row(AbstractTreeViewItem &item) const uiBlock &block_ = block(); uiLayout &prev_layout = current_layout(); + + const int width = uiLayoutGetWidth(&prev_layout); + if (width < int(40 * UI_SCALE_FAC)) { + return; + } + blender::ui::EmbossType previous_emboss = UI_block_emboss_get(&block_); uiLayout *overlap = &prev_layout.overlap();