#pragma once #include "creeper-qt/utility/qt_wrapper/enter-event.hh" #include "creeper-qt/utility/theme/theme.hh" #include "creeper-qt/utility/wrapper/common.hh" #include "creeper-qt/utility/wrapper/pimpl.hh" #include "creeper-qt/utility/wrapper/property.hh" #include "creeper-qt/utility/wrapper/widget.hh" #include namespace creeper { namespace _switch::internal { class Switch : public QAbstractButton { CREEPER_PIMPL_DEFINITION(Switch) public: void set_color_scheme(const ColorScheme&); void load_theme_manager(ThemeManager&); void set_disabled(bool); bool disabled() const; void set_checked(bool); bool checked() const; void set_track_color_unchecked(const QColor&); void set_track_color_checked(const QColor&); void set_track_color_unchecked_disabled(const QColor&); void set_track_color_checked_disabled(const QColor&); void set_handle_color_unchecked(const QColor&); void set_handle_color_checked(const QColor&); void set_handle_color_unchecked_disabled(const QColor&); void set_handle_color_checked_disabled(const QColor&); void set_outline_color_unchecked(const QColor&); void set_outline_color_checked(const QColor&); void set_outline_color_unchecked_disabled(const QColor&); void set_outline_color_checked_disabled(const QColor&); void set_hover_color_unchecked(const QColor&); void set_hover_color_checked(const QColor&); protected: // 添加 Hover 动画 void enterEvent(qt::EnterEvent* event) override; void leaveEvent(QEvent* event) override; // 实现视觉效果 void paintEvent(QPaintEvent* event) override; }; } namespace _switch::pro { using Token = common::Token; /// @note 碎碎念,这么多颜色,真的会用得上么... using TrackColorUnchecked = SetterProp; using TrackColorChecked = SetterProp; using TrackColorUncheckedDisabled = SetterProp; using TrackColorCheckedDisabled = SetterProp; using HandleColorUnchecked = SetterProp; using HandleColorChecked = SetterProp; using HandleColorUncheckedDisabled = SetterProp; using HandleColorCheckedDisabled = SetterProp; using OutlineColorUnchecked = SetterProp; using OutlineColorChecked = SetterProp; using OutlineColorUncheckedDisabled = SetterProp; using OutlineColorCheckedDisabled = SetterProp; using HoverColorUnchecked = SetterProp; using HoverColorChecked = SetterProp; template using Clickable = common::pro::Clickable; using Disabled = common::pro::Disabled; using Checked = common::pro::Checked; template concept trait = std::derived_from; CREEPER_DEFINE_CHECKER(trait); using namespace theme::pro; using namespace widget::pro; } /// @note 使用时建议比例 w : h > 7 : 4 ,过冲动画会多占用一些宽度,倘若 w 过短,可能会出现 hover /// 层画面被截断的情况 using Switch = Declarative<_switch::internal::Switch, CheckerOr<_switch::pro::checker, widget::pro::checker, theme::pro::checker>>; }