#include #include namespace psemek::ui { namespace { struct button_impl : button { struct shape const & shape() const override { return shape_; } void reshape(geom::box const & bbox) override { shape_.box = bbox; } void draw(painter & p) const override { gfx::color_rgba color = gfx::red; if (state() == state_t::mouseover) color = gfx::light(color); else if (state() == state_t::mousedown) color = gfx::dark(color); p.draw_rect(shape_.box, color); } geom::box size_constraints() const override { return {{{100.f, 200.f}, {50.f, 100.f}}}; } private: box_shape shape_{{{{0.f, 0.f}, {0.f, 0.f}}}}; }; } struct default_element_factory::impl { std::shared_ptr font; }; default_element_factory::default_element_factory() : pimpl_{make_impl()} {} default_element_factory::~default_element_factory() = default; void default_element_factory::set_font(std::shared_ptr f) { impl().font = std::move(f); } std::shared_ptr default_element_factory::font() const { return impl().font; } std::unique_ptr