diff options
-rw-r--r-- | source/blender/editors/space_outliner/outliner_draw.cc | 76 |
1 files changed, 68 insertions, 8 deletions
diff --git a/source/blender/editors/space_outliner/outliner_draw.cc b/source/blender/editors/space_outliner/outliner_draw.cc index 8a1119d5e66..34d1e1bb546 100644 --- a/source/blender/editors/space_outliner/outliner_draw.cc +++ b/source/blender/editors/space_outliner/outliner_draw.cc @@ -2941,16 +2941,66 @@ static bool tselem_draw_icon(uiBlock *block, return true; } +static bool outliner_is_main_row(const ARegion *region, const int ys) +{ + int ystart; + + ystart = int(region->v2d.tot.ymax); + ystart = UI_UNIT_Y * (ystart / (UI_UNIT_Y)) - OL_Y_OFFSET; + + return ((ys - ystart) / UI_UNIT_Y) % 2; +} + +/** + * Get the expected row background color to use for the data-block counter + * + * This reproduces somes of the logic of outliner_draw_highlights. + * At the moment it doesn't implement the search match color since + * we don't draw the data-block counter in those cases. + */ +static void outliner_get_row_color(const ARegion *region, + const TreeElement *te, + int ys, + float r_color[4]) +{ + const TreeStoreElem *tselem = TREESTORE(te); + + if ((tselem->flag & TSE_ACTIVE) && (tselem->flag & TSE_SELECTED)) { + UI_GetThemeColor3fv(TH_ACTIVE, r_color); + } + else if (tselem->flag & TSE_SELECTED) { + UI_GetThemeColor3fv(TH_SELECT_HIGHLIGHT, r_color); + } + else if (outliner_is_main_row(region, ys)) { + UI_GetThemeColor3fv(TH_BACK, r_color); + } + else { + float color_alternating[4]; + UI_GetThemeColor4fv(TH_ROW_ALTERNATE, color_alternating); + UI_GetThemeColorBlend3f(TH_BACK, TH_ROW_ALTERNATE, color_alternating[3], r_color); + } + + if (tselem->flag & TSE_HIGHLIGHTED) { + const float color_highlight[4] = {1.0f, 1.0f, 1.0f, 0.13f}; + interp_v3_v3v3(r_color, r_color, color_highlight, color_highlight[3]); + } + r_color[3] = 1.0f; +} + /** * For icon-only children of a collapsed tree, * Draw small number over the icon to show how many items of this type are displayed. */ -static void outliner_draw_iconrow_number(const uiFontStyle *fstyle, +static void outliner_draw_iconrow_number(const ARegion *region, + const uiFontStyle *fstyle, int offsx, int ys, + const TreeElement *te_visible, const int num_elements) { - const float color[4] = {0.0f, 0.0f, 0.0f, 1.0f}; + float color[4]; + outliner_get_row_color(region, te_visible, ys, color); + float ufac = 0.25f * UI_UNIT_X; float offset_x = float(offsx) + UI_UNIT_X * 0.35f; rctf rect{}; @@ -2961,12 +3011,13 @@ static void outliner_draw_iconrow_number(const uiFontStyle *fstyle, float(ys) - UI_UNIT_Y * 0.2f + UI_UNIT_Y - ufac); UI_draw_roundbox_corner_set(UI_CNR_ALL); - UI_draw_roundbox_aa(&rect, true, float(UI_UNIT_Y) / 2.0f - ufac, color); + UI_draw_roundbox_4fv_ex( + &rect, color, NULL, 1.0f, color, U.pixelsize, float(UI_UNIT_Y) / 2.0f - ufac); /* Now the numbers. */ uchar text_col[4]; - UI_GetThemeColor3ubv(TH_TEXT_HI, text_col); + UI_GetThemeColor3ubv(TH_TEXT, text_col); text_col[3] = 255; uiFontStyle fstyle_small = *fstyle; @@ -3018,7 +3069,9 @@ static void outliner_draw_active_indicator(const float minx, GPU_blend(GPU_BLEND_ALPHA); /* Round-box disables. */ } -static void outliner_draw_iconrow_doit(uiBlock *block, +static void outliner_draw_iconrow_doit(const ARegion *region, + uiBlock *block, + TreeElement *te_visible, TreeElement *te, const uiFontStyle *fstyle, int xmax, @@ -3055,7 +3108,7 @@ static void outliner_draw_iconrow_doit(uiBlock *block, te->xend = short(*offsx) + UI_UNIT_X; if (num_elements > 1) { - outliner_draw_iconrow_number(fstyle, *offsx, ys, num_elements); + outliner_draw_iconrow_number(region, fstyle, *offsx, ys, te_visible, num_elements); te->flag |= TE_ICONROW_MERGED; } else { @@ -3092,6 +3145,7 @@ static void outliner_draw_iconrow(bContext *C, const uiFontStyle *fstyle, const TreeViewContext *tvc, SpaceOutliner *space_outliner, + TreeElement *te_visible, ListBase *lb, int level, int xmax, @@ -3100,6 +3154,7 @@ static void outliner_draw_iconrow(bContext *C, float alpha_fac, MergedIconRow *merged) { + const ARegion *region = CTX_wm_region(C); eOLDrawState active = OL_DRAWSEL_NONE; LISTBASE_FOREACH (TreeElement *, te, lb) { @@ -3139,7 +3194,8 @@ static void outliner_draw_iconrow(bContext *C, TSE_POSE_CHANNEL, TSE_POSEGRP, TSE_DEFGROUP)) { - outliner_draw_iconrow_doit(block, te, fstyle, xmax, offsx, ys, alpha_fac, active, 1); + outliner_draw_iconrow_doit( + region, block, te_visible, te, fstyle, xmax, offsx, ys, alpha_fac, active, 1); } else { const int index = tree_element_id_type_to_index(te); @@ -3158,6 +3214,7 @@ static void outliner_draw_iconrow(bContext *C, fstyle, tvc, space_outliner, + te, &te->subtree, level + 1, xmax, @@ -3179,7 +3236,9 @@ static void outliner_draw_iconrow(bContext *C, for (int j = 0; j < num_subtypes; j++) { const int index = index_base + j; if (merged->num_elements[index] != 0) { - outliner_draw_iconrow_doit(block, + outliner_draw_iconrow_doit(region, + block, + te_visible, merged->tree_element[index], fstyle, xmax, @@ -3419,6 +3478,7 @@ static void outliner_draw_tree_element(bContext *C, fstyle, tvc, space_outliner, + te, &te->subtree, 0, xmax, |