#include "GraphicApplication.hpp" #include "RootWidget.hpp" #include "AnimationTestWidget.hpp" #include "FloatingWidget.hpp" #include "DockWidget.hpp" using namespace tp; /* * adjust child widgets in the layout view * make scrollable area * change Widget::clampMinMax function to include child enclosure * refactor all sizing in Widget -> move to separate files * refactor root widget -> reorganize code */ class WidgetApplication : public Application { public: WidgetApplication() { exampleNestedMenus(); // examplePopup(); } void examplePopup() { static Widget root; static ButtonWidget closeButton; static ButtonWidget openButton; root.addChild(&openButton); ((BasicLayout*)root.getLayout())->setLayoutPolicy(LayoutPolicy::Passive); openButton.setAction([&](){ closeButton.setArea({ 50, 50, 100, 100 }); openButton.openPopup(&closeButton); }); closeButton.setAction([&](){ closeButton.closePopup(&closeButton); }); openButton.setText("open"); closeButton.setText("close"); RootWidget::setWidgetArea(openButton, { 333, 333, 222, 222 }); mRootWidget.setRootWidget(&root); } void exampleNestedMenus() { static DockWidget dock; static FloatingMenu menu1; static FloatingMenu menu2; static ButtonWidget buttons[15]; mRootWidget.setRootWidget(&dock); dock.addChild(&menu1); dock.addChild(&menu2); dock.setCenterWidget(&buttons[5]); dock.dockWidget(&buttons[6], DockLayout::RIGHT); menu1.addToMenu(&buttons[0]); menu2.addToMenu(&buttons[2]); menu2.addToMenu(&buttons[3]); menu2.addToMenu(&buttons[4]); menu2.addToMenu(&menu1); RootWidget::setWidgetArea(menu1, { 300, 100, 150, 500 }); RootWidget::setWidgetArea(menu2, { 100, 100, 150, 300 }); } void exampleLayouts() { static Widget widgets[15]; static ButtonWidget buttons[15]; mRootWidget.setRootWidget(&widgets[0]); widgets[0].addChild(&widgets[1]); widgets[1].addChild(&buttons[1]); widgets[1].addChild(&buttons[2]); widgets[1].addChild(&widgets[2]); RootWidget::setWidgetArea(buttons[1], { 300, 100, 350, 800 }); RootWidget::setWidgetArea(buttons[2], { 100, 100, 150, 300 }); widgets[2].addChild(&buttons[3]); widgets[2].addChild(&buttons[4]); widgets[2].addChild(&buttons[5]); widgets[2].addChild(&buttons[6]); buttons[1].setSizePolicy(SizePolicy::Expanding, SizePolicy::Expanding); buttons[2].setSizePolicy(SizePolicy::Expanding, SizePolicy::Expanding); buttons[3].setSizePolicy(SizePolicy::Expanding, SizePolicy::Expanding); buttons[4].setSizePolicy(SizePolicy::Expanding, SizePolicy::Expanding); buttons[5].setSizePolicy(SizePolicy::Expanding, SizePolicy::Expanding); buttons[6].setSizePolicy(SizePolicy::Expanding, SizePolicy::Expanding); widgets[2].setSizePolicy(SizePolicy::Expanding, SizePolicy::Expanding); ((BasicLayout*)widgets[1].getLayout())->setLayoutPolicy(LayoutPolicy::Horizontal); } void setup1() { static DockWidget dock; static FloatingMenu menu1; static FloatingMenu menu2; static ButtonWidget buttons[15]; mRootWidget.setRootWidget(&dock); dock.addChild(&menu2); dock.addChild(&menu1); dock.setCenterWidget(&buttons[5]); dock.dockWidget(&buttons[6], DockLayout::RIGHT); menu1.addToMenu(&buttons[0]); menu2.addToMenu(&buttons[2]); //menu2.addToMenu(&menu1); menu2.addToMenu(&buttons[3]); menu2.addToMenu(&buttons[4]); buttons[0].setAction([&]() { buttons[2].setColor(RGBA::random()); }); buttons[2].setAction([&]() { buttons[0].setColor(RGBA::random()); }); buttons[5].setAction([&]() { dock.dockWidget(&menu1, DockLayout::LEFT); }); buttons[6].setAction([&]() { dock.undockWidget(DockLayout::LEFT); }); buttons[3].setAction([&]() { dock.toggleWidgetVisibility(DockLayout::LEFT); }); // buttons[4].setAction([this]() { mDockLayout.undockWidget(DockLayout::LEFT); }); buttons[3].setText("toggle"); buttons[5].setText("dock"); buttons[6].setText("undock"); // mLayoutWidget.addChild(&buttons[2]); // mWidgetFloating.addChild(&buttons[0]); // mRootWidget.setRootWidget(&mAnimationTestWidget); // mAnimationTestWidget.addChild(&mWidgetFloating); // mAnimationTestWidget.addChild(&mLayoutWidget); RootWidget::setWidgetArea(menu2, { 300, 100, 150, 500 }); RootWidget::setWidgetArea(menu1, { 100, 100, 150, 300 }); // mWidgetFloating.addChild(&mLayoutWidget); // mLayoutWidget.addChild(&buttons[0]); // mLayoutWidget.addChild(&mLabel); } void processFrame(EventHandler* eventHandler, halnf deltaTime) override { const auto rec = RectF({ 0, 0 }, mWindow->getSize()); mRootWidget.processFrame(eventHandler, rec); } void drawFrame(Canvas* canvas) override { mRootWidget.drawFrame(*canvas); drawDebug(); } bool forceNewFrame() override { return mRootWidget.needsUpdate(); } private: RootWidget mRootWidget; }; int main() { { WidgetApplication gui; gui.run(); } }