#pragma once #include #include #include #include #include #include namespace chatterino { template requires std::derived_from || std::derived_from class LayoutCreator { public: LayoutCreator(T *_item) : item_(_item) { } T *operator->() { return this->item_; } T &operator*() { return *this->item_; } T *getElement() { return this->item_; } template LayoutCreator append(U *item) { addItem(this->getOrCreateLayout(), item); return LayoutCreator(item); } template LayoutCreator emplace(auto &&...args) { auto *t = new U(std::forward(args)...); addItem(this->getOrCreateLayout(), t); return LayoutCreator(t); } LayoutCreator emplaceScrollAreaWidget() requires std::derived_from { auto *widget = new QWidget; this->item_->setWidget(widget); return {widget}; } template U> LayoutCreator setLayoutType() requires std::derived_from { U *layout = new U; this->item_->setLayout(layout); return LayoutCreator(layout); } LayoutCreator assign(T **ptr) { *ptr = this->item_; return *this; } LayoutCreator withoutMargin() { this->item_->setContentsMargins(0, 0, 0, 0); return *this; } LayoutCreator withoutSpacing() requires std::derived_from { this->item_->setSpacing(0); return *this; } LayoutCreator hidden() requires std::derived_from { this->item_->setVisible(false); return *this; } template U> LayoutCreator appendTab(U *item, const QString &title) requires std::derived_from { auto *widget = new QWidget; widget->setLayout(item); this->item_->addTab(widget, title); return LayoutCreator(item); } template LayoutCreator connect(Slot slot, QObject *receiver, Func func) { QObject::connect(this->getElement(), slot, receiver, func); return *this; } template LayoutCreator onClick(QObject *receiver, Func func) { QObject::connect(this->getElement(), &T::clicked, receiver, func); return *this; } private: T *item_; static void addItem(QLayout *layout, QWidget *item) { layout->addWidget(item); } static void addItem(QLayout *layout, QLayout *item) { auto *widget = new QWidget(); widget->setLayout(item); layout->addWidget(widget); } QLayout *getOrCreateLayout() requires std::derived_from { return this->item_; } QLayout *getOrCreateLayout() requires std::derived_from { if (!this->item_->layout()) { this->item_->setLayout(new QHBoxLayout()); } return this->item_->layout(); } }; template LayoutCreator makeDialog(auto &&...args) { T *t = new T(std::forward(args)...); t->setAttribute(Qt::WA_DeleteOnClose); return LayoutCreator(t); } } // namespace chatterino