#pragma once #include #include "creeper-qt/utility/trait/widget.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" namespace creeper::main_window::internal { template concept central_widget_trait = requires(T t, QWidget* widget) { { t.setCentralWidget(widget) }; }; class MainWindow : public QMainWindow { CREEPER_PIMPL_DEFINITION(MainWindow) protected: auto paintEvent(QPaintEvent*) -> void override; }; } namespace creeper::main_window::pro { using Token = common::Token; template struct Central : Token { T* widget_pointer; explicit Central(T* pointer) noexcept : widget_pointer { pointer } { } explicit Central(auto&&... args) noexcept requires std::constructible_from : widget_pointer { new T { std::forward(args)... }, } { } auto apply(internal::central_widget_trait auto& self) const noexcept -> void { self.setCentralWidget(this->widget_pointer); } }; template concept trait = std::derived_from; CREEPER_DEFINE_CHECKER(trait); using namespace widget::pro; } namespace creeper { using MainWindow = Declarative>; /// @brief 一点显示窗口的语法糖 template struct ShowWindow final { T* window_pointer; explicit ShowWindow(auto&&... args) noexcept requires std::constructible_from : window_pointer { new T { std::forward(args)... }, } { window_pointer->show(); } explicit ShowWindow(T*& window, auto&&... args) noexcept requires std::constructible_from : ShowWindow { std::forward(args)... } { window = window_pointer; } explicit ShowWindow(std::invocable auto f, auto&&... args) noexcept requires std::constructible_from : ShowWindow { std::forward(args)... } { std::invoke(f, *window_pointer); } }; }