#pragma once #include "../Base.h" #include "ApplyBorderStyleInfo.h" #include "cru/common/ClonablePtr.h" #include "cru/platform/gui/Cursor.h" #include #include namespace cru::ui::style { class Styler : public Object { public: virtual void Apply(controls::Control* control) const = 0; virtual Styler* Clone() const = 0; }; class CompoundStyler : public Styler { public: template static ClonablePtr Create(ClonablePtr... s) { return ClonablePtr( new CompoundStyler(std::vector>{std::move(s)...})); } static ClonablePtr Create( std::vector> stylers) { return ClonablePtr(new CompoundStyler(std::move(stylers))); } explicit CompoundStyler(std::vector> stylers) : stylers_(std::move(stylers)) {} void Apply(controls::Control* control) const override { for (const auto& styler : stylers_) { styler->Apply(control); } } virtual CompoundStyler* Clone() const override { return new CompoundStyler(stylers_); } private: std::vector> stylers_; }; class BorderStyler : public Styler { public: static ClonablePtr Create() { return ClonablePtr(new BorderStyler()); } static ClonablePtr Create(ApplyBorderStyleInfo style) { return ClonablePtr(new BorderStyler(std::move(style))); } BorderStyler() = default; explicit BorderStyler(ApplyBorderStyleInfo style); void Apply(controls::Control* control) const override; BorderStyler* Clone() const override { return new BorderStyler(style_); } private: ApplyBorderStyleInfo style_; }; class CursorStyler : public Styler { public: static ClonablePtr Create( std::shared_ptr cursor) { return ClonablePtr(new CursorStyler(std::move(cursor))); } static ClonablePtr Create(platform::gui::SystemCursorType type); explicit CursorStyler(std::shared_ptr cursor) : cursor_(std::move(cursor)) {} void Apply(controls::Control* control) const override; CursorStyler* Clone() const override { return new CursorStyler(cursor_); } private: std::shared_ptr cursor_; }; } // namespace cru::ui::style