#include #include #include #include #include #include #include #include #include using namespace Wt; /* * A utility container widget which defers creation of its single * child widget until the container is loaded (which is done on-demand * by a WMenu). The constructor takes the create function for the * widget as a parameter. * * We use this to defer widget creation until needed, which also defers * loading auxiliary javascript libraries. */ #if !defined(WT_TARGET_JAVA) template class DeferredWidget : public Wt::WContainerWidget { public: DeferredWidget(Function f) : f_(f) { } private: void load() { addWidget(f_()); Wt::WContainerWidget::load(); } Function f_; }; template std::unique_ptr> deferCreate(Function f) { return std::make_unique>(f); } #else class DeferredWidget : public Wt::WContainerWidget { public: DeferredWidget(std::bound f) {} }; std::unique_ptr deferCreate(std::bound b) { return std::make_unique(b); } #endif // ----------------------------------------------------------------------------------- std::unique_ptr createSplitView() { std::cerr << "*** Create Split View" << std::endl; auto flexCont = std::make_unique(); flexCont->setAttributeValue("style", "width: 100%; height: 100%; background-color: yellow;"); auto vLayout = flexCont->setLayout(std::make_unique()); auto splitHLayout = vLayout->addLayout(std::make_unique(), 1); splitHLayout->setPreferredImplementation(LayoutImplementation::JavaScript); auto leftCont = splitHLayout->addWidget(std::make_unique()); leftCont->setAttributeValue("style", "width: 100%; height: 100%;"); leftCont->decorationStyle().setBackgroundColor(WColor("blue")); leftCont->setMinimumSize(WLength::Auto, 50); leftCont->addNew("Left Container"); auto rightCont = splitHLayout->addWidget(std::make_unique()); rightCont->setAttributeValue("style", "width: 100%; height: 100%;"); rightCont->decorationStyle().setBackgroundColor(WColor("green")); rightCont->setMinimumSize(WLength::Auto, 50); rightCont->addNew("Right Container"); splitHLayout->setResizable(0, true, WLength(70, LengthUnit::Percentage)); return flexCont; } // ----------------------------------------------------------------------------------- std::unique_ptr createHelloApplication(const WEnvironment &env) { auto app = std::make_unique(env); auto theme = std::make_shared(); app->setTheme(theme); app->root()->setAttributeValue("style", "width: 100%; height: 100%;"); auto hLayout = app->root()->setLayout(std::make_unique()); auto leftCont = hLayout->addWidget(std::make_unique()); leftCont->setAttributeValue("style", "background-color: #b3daff;"); leftCont->setWidth(200); auto rightCont = hLayout->addWidget(std::make_unique(), 1); rightCont->setAttributeValue("style", "background-color: grey;"); auto rightVLayout = rightCont->setLayout(std::make_unique()); auto stackUP = std::make_unique(); auto menu = leftCont->addNew(stackUP.get()); rightVLayout->addWidget(std::move(stackUP), 1); menu->addItem("Stack Level 0", std::make_unique("Empty")); // This will work: // menu->addItem("Split Test", createSplitView()); // This will not work: menu->addItem("Split Text", deferCreate(std::bind(&createSplitView))); return app; } // ----------------------------------------------------------------------------------- int main(int argc, char *argv[]) { try { WServer server(argc, argv, WTHTTP_CONFIGURATION); server.addEntryPoint(EntryPointType::Application, std::bind(&createHelloApplication, std::placeholders::_1)); if (server.start()) { int sig = WServer::waitForShutdown(); std::cerr << "*** Shutdown (signal = " << sig << ")" << std::endl; server.stop(); if (sig == 1) // SIGHUP WServer::restart(argc, argv, environ); return 0; } } catch (WServer::Exception &e) { std::cerr << "*** Server Exception: " << e.what() << std::endl; } catch (std::exception &e) { std::cerr << "*** Std Exception: " << e.what() << std::endl; } }