#pragma once #include "modern-qt/utility/painter/helper.hh" #include "modern-qt/utility/wrapper/property.hh" #include "modern-qt/utility/wrapper/widget.hh" #include "modern-qt/widget/shape/shape.hh" namespace creeper::rounded_rect::internal { class RoundedRect : public Shape { public: void set_radius(double radius) { radius_nx_ny_ = radius; radius_px_py_ = radius; radius_nx_py_ = radius; radius_px_ny_ = radius; update(); } void set_radius_nx_ny(double radius) { radius_nx_ny_ = radius; update(); } void set_radius_px_py(double radius) { radius_px_py_ = radius; update(); } void set_radius_nx_py(double radius) { radius_nx_py_ = radius; update(); } void set_radius_px_ny(double radius) { radius_px_ny_ = radius; update(); } void set_radius_top_left(double radius) { set_radius_nx_ny(radius); } void set_radius_top_right(double radius) { set_radius_px_ny(radius); } void set_radius_bottom_left(double radius) { set_radius_nx_py(radius); } void set_radius_bottom_right(double radius) { set_radius_px_py(radius); } protected: void paintEvent(QPaintEvent* event) override { auto painter = QPainter { this }; util::PainterHelper { painter } .set_render_hint(QPainter::Antialiasing) .rounded_rectangle( // background_, border_color_, border_width_, rect(), radius_nx_ny_, // tl: 左上 radius_px_ny_, // tr: 右上 radius_px_py_, // br: 右下 radius_nx_py_ // bl: 左下 ) .done(); } private: double radius_nx_ny_ = 0; double radius_px_py_ = 0; double radius_nx_py_ = 0; double radius_px_ny_ = 0; }; } namespace creeper::rounded_rect::pro { using Token = common::Token; // 通用属性 using Radius = common::pro::Radius; using RadiusPxPy = common::pro::RadiusPxPy; using RadiusNxNy = common::pro::RadiusNxNy; using RadiusPxNy = common::pro::RadiusPxNy; using RadiusNxPy = common::pro::RadiusNxPy; using RadiusTopLeft = RadiusNxNy; using RadiusTopRight = RadiusPxNy; using RadiusBottomLeft = RadiusNxPy; using RadiusBottomRight = RadiusPxPy; using Background = common::pro::Background; using BorderWidth = common::pro::BorderWidth; using BorderColor = common::pro::BorderColor; template concept trait = std::derived_from; CREEPER_DEFINE_CHECKER(trait) using namespace widget::pro; } namespace creeper { using RoundedRect = Declarative>; }