From 3a5e29835fb7cb660279aee0ac48be0bf4c11e2b Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 13 Oct 2021 23:16:25 +0300 Subject: [PATCH] Implement bevels in default_element_factory frame --- libs/ui/source/default_element_factory.cpp | 43 ++++++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/libs/ui/source/default_element_factory.cpp b/libs/ui/source/default_element_factory.cpp index 77013f6e..733b43e2 100644 --- a/libs/ui/source/default_element_factory.cpp +++ b/libs/ui/source/default_element_factory.cpp @@ -113,7 +113,7 @@ namespace psemek::ui auto st = merged_own_style(); if (!st) return; for (auto c : children()) - if (c) c->reshape(geom::shrink(bbox, 1.f * (*st->border_width + *st->outer_margin))); + if (c) c->reshape(geom::shrink(bbox, 1.f * (*st->border_width + *st->bevel_width + *st->outer_margin))); } geom::box size_constraints() const override @@ -127,7 +127,7 @@ namespace psemek::ui auto st = merged_own_style(); if (st) { - float extra = 2.f * (*st->border_width + *st->outer_margin); + float extra = 2.f * (*st->border_width + *st->bevel_width + *st->outer_margin); r[0] += extra; r[1] += extra; } @@ -159,7 +159,44 @@ namespace psemek::ui if (st->border_width > 0) p.draw_rect(shape_.box, *st->border_color); - p.draw_rect(geom::shrink(shape_.box, 1.f * (*st->border_width)), *st->bg_color); + + if (st->bevel_width > 0) + { + geom::point corners[4]; + geom::point corners_in[4]; + + auto box = geom::shrink(shape_.box, *st->border_width); + + corners[0] = box.corner(0, 0); + corners[1] = box.corner(1, 0); + corners[2] = box.corner(1, 1); + corners[3] = box.corner(0, 1); + + auto box_in = geom::shrink(box, *st->bevel_width); + + corners_in[0] = box_in.corner(0, 0); + corners_in[1] = box_in.corner(1, 0); + corners_in[2] = box_in.corner(1, 1); + corners_in[3] = box_in.corner(0, 1); + + auto c1 = *st->bevel_light_color; + auto c2 = *st->bevel_dark_color; + + if (*st->bevel_type == bevel_type::down) + std::swap(c1, c2); + + p.draw_triangle({corners[0], corners_in[0], corners[1]}, c1); + p.draw_triangle({corners[1], corners_in[0], corners_in[1]}, c1); + p.draw_triangle({corners[1], corners_in[1], corners[2]}, c1); + p.draw_triangle({corners[2], corners_in[1], corners_in[2]}, c1); + + p.draw_triangle({corners[2], corners_in[2], corners[3]}, c2); + p.draw_triangle({corners[3], corners_in[2], corners_in[3]}, c2); + p.draw_triangle({corners[3], corners_in[3], corners[0]}, c2); + p.draw_triangle({corners[0], corners_in[3], corners_in[0]}, c2); + } + + p.draw_rect(geom::shrink(shape_.box, 1.f * (*st->border_width + *st->bevel_width)), *st->bg_color); } private: