#pragma once #include "modern-qt/utility/wrapper/property.hh" #include namespace creeper::qt { using painter = QPainter; using point = QPointF; using size = QSizeF; using rect = QRectF; using color = QColor; using real = qreal; using align = Qt::Alignment; using string = QString; using font = QFont; using text_option = QTextOption; } namespace creeper::painter { template concept common_trait = requires(T t) { { auto { t.origin } } -> std::same_as; { auto { t.size } } -> std::same_as; }; template concept container_trait = requires(T t) { { auto { t.align } } -> std::same_as; } && common_trait; template concept shape_trait = requires(T t) { { auto { t.color_container } } -> std::same_as; { auto { t.color_outline } } -> std::same_as; { auto { t.thickness_outline } } -> std::same_as; }; template concept drawable_trait = common_trait && std::invocable; struct CommonProps { qt::point origin = qt::point { 0, 0 }; qt::size size = qt::size { 0, 0 }; auto rect() const { return qt::rect { origin, size }; } }; struct ContainerProps { qt::size size = qt::size { 0, 0 }; qt::align align = qt::align {}; qt::point origin = qt::point { 0, 0 }; auto rect() const { return qt::rect { origin, size }; } }; struct ShapeProps { qt::color container_color = Qt::transparent; qt::color outline_color = Qt::transparent; qt::real outline_width = 0; }; } namespace creeper::painter::common::pro { struct Token { }; using Size = DerivedProp; using Origin = DerivedProp; using ContainerColor = SetterProp; using OutlineColor = SetterProp; using OutlineWidth = SetterProp; struct Outline : Token { qt::color color; qt::real width; Outline(const qt::color& color, qt::real width) : color { color } , width { width } { } auto apply(auto& self) { self.outline_color = color; self.outline_width = width; } }; /// Alias using Fill = ContainerColor; /// Export template concept trait = std::derived_from; CREEPER_DEFINE_CHECKER(trait); }