#pragma once #include "modern-qt/utility/qt_wrapper/margin_setter.hh" #include "modern-qt/utility/trait/widget.hh" #include "modern-qt/utility/wrapper/common.hh" namespace creeper::layout::pro { struct Layout { }; using Token = common::Token; using ContentsMargin = SetterProp; using Alignment = SetterProp; using Spacing = SetterProp; using Margin = SetterProp; template struct Widget : Token { T* item_pointer = nullptr; explicit Widget(T* pointer) noexcept : item_pointer { pointer } { } explicit Widget(auto&&... args) noexcept requires std::constructible_from : item_pointer { new T { std::forward(args)... } } { } auto apply(auto& layout) const { layout.addWidget(item_pointer); } }; // 传入一个方法用来辅助构造,在没有想要的接口时用这个吧 template struct Apply : Token { Lambda lambda; explicit Apply(Lambda lambda) noexcept : lambda { lambda } { } auto apply(auto& self) const noexcept -> void { if constexpr (std::invocable) lambda(); if constexpr (std::invocable) lambda(self); } }; template concept trait = std::derived_from; CREEPER_DEFINE_CHECKER(trait); }