Project

General

Profile

Support #6916 » WtHome.C

Karl Estermann, 02/21/2019 01:30 PM

 
/*
* Copyright (C) 2008 Emweb bvba, Kessel-Lo, Belgium.
*
* See the LICENSE file for terms of use.
*/

#include "WtHome.h"
#include "Form.h"

#ifdef WT_EMWEB_BUILD
#include "QuoteForm.h"
#endif // WT_EMWEB_BUILD

#include <Wt/WAnchor.h>
#include <Wt/WEnvironment.h>
#include <Wt/WLogger.h>
#include <Wt/WMenuItem.h>
#include <Wt/WStackedWidget.h>
#include <Wt/WTable.h>
#include <Wt/WTabWidget.h>
#include <Wt/WText.h>
#include <Wt/WTreeNode.h>
#include <Wt/WViewWidget.h>
#include <Wt/WWidget.h>
#include <Wt/WStringUtil.h>


#include "ExampleSourceViewer.h"

using namespace Wt;

WtHome::WtHome(const WEnvironment& env, Dbo::SqlConnectionPool& blogDb)
: Home(env, blogDb, "Wt, C++ Web Toolkit", "wt-home", "css/wt")
{
addLanguage(Lang("en", "/", "en", "English"));
addLanguage(Lang("cn", "/cn/", "汉语", "中文 (Chinese)"));
addLanguage(Lang("ru", "/ru/", "ру", "Русский (Russian)"));

char* wtExamplePath = getenv("WT_EXAMPLE_PATH");
if (wtExamplePath)
wtExamplePath_ = wtExamplePath;
else
wtExamplePath_ = "..";

init();
}

std::unique_ptr<WWidget> WtHome::example(const char *textKey, const std::string& sourceDir)
{
auto result = cpp14::make_unique<WContainerWidget>();
WText *w = result->addWidget(cpp14::make_unique<WText>(tr(textKey)));
w->setInternalPathEncoding(true);
result->addWidget(linkSourceBrowser(sourceDir));
return std::move(result);
}

//std::unique_ptr<WWidget> WtHome::form(const char *textKey, const std::string& sourceDir)
//{
//
// auto result = cpp14::make_unique<WContainerWidget>();
//
// WContainerWidget *langLayout = result->addWidget(cpp14::make_unique<WContainerWidget>());
// langLayout->setContentAlignment(AlignmentFlag::Right);
// langLayout->addWidget(cpp14::make_unique<WText>(tr("language")));
//
// Form *f = result->addWidget(cpp14::make_unique<Form>());
// f->setMargin(20);
//
// WText *w = result->addWidget(cpp14::make_unique<WText>(tr(textKey)));
// w->setInternalPathEncoding(true);
// result->addWidget(linkSourceBrowser(sourceDir));
// return std::move(result);
//}

std::unique_ptr<WWidget> WtHome::form()
{
auto result = cpp14::make_unique<WContainerWidget>();
Form *f = result->addWidget(cpp14::make_unique<Form>());
f->setMargin(20);
// std::unique_ptr<Form> f
// = cpp14::make_unique<Form>();

return std::move(result);
}

std::unique_ptr<WWidget> WtHome::helloWorldExample()
{
return form();
}

std::unique_ptr<WWidget> WtHome::chartExample()
{
return example("home.examples.chart", "charts");
}

std::unique_ptr<WWidget> WtHome::homepageExample()
{
return example("home.examples.wt", "wt-homepage");
}

std::unique_ptr<WWidget> WtHome::treeviewExample()
{
return example("home.examples.treeview", "treeview-dragdrop");
}

std::unique_ptr<WWidget> WtHome::gitExample()
{
return example("home.examples.git", "gitmodel");
}

std::unique_ptr<WWidget> WtHome::chatExample()
{
return example("home.examples.chat", "simplechat");
}

std::unique_ptr<WWidget> WtHome::composerExample()
{
return example("home.examples.composer", "composer");
}

std::unique_ptr<WWidget> WtHome::widgetGalleryExample()
{
return example("home.examples.widgetgallery", "widgetgallery");
}

std::unique_ptr<WWidget> WtHome::hangmanExample()
{
return example("home.examples.hangman", "hangman");
}

std::unique_ptr<WWidget> WtHome::examples()
{
auto result = cpp14::make_unique<WContainerWidget>();

// auto intro = cpp14::make_unique<WText>(tr("home.examples"));
// intro->setInternalPathEncoding(true);
// result->addWidget(std::move(intro));

examplesMenu_ = result->addWidget(cpp14::make_unique<WTabWidget>());

WAnimation animation(AnimationEffect::SlideInFromRight, TimingFunction::EaseIn);
examplesMenu_->contentsStack()->setTransitionAnimation(animation, true);

/*
* The following code is functionally equivalent to:
*
* examplesMenu_->addTab(helloWorldExample(), "Hello world");
*
* However, we optimize here for memory consumption (it is a homepage
* after all, and we hope to be slashdotted some day)
*
* Therefore, we wrap all the static content (including the tree
* widgets), into WViewWidgets with static models. In this way the
* widgets are not actually stored in memory on the server.
*/

// The call ->setPathComponent() is to use "/examples/" instead of
// "/examples/hello_world" as internal path
examplesMenu_->addTab(wrapView(&WtHome::helloWorldExample),
tr("hello-world"))->setPathComponent("");
examplesMenu_->addTab(wrapView(&WtHome::widgetGalleryExample),
tr("widget-gallery"));
examplesMenu_->addTab(wrapView(&WtHome::chartExample),
tr("charts"));
examplesMenu_->addTab(wrapView(&WtHome::homepageExample),
tr("wt-homepage"));
examplesMenu_->addTab(wrapView(&WtHome::treeviewExample),
tr("treeview"));
examplesMenu_->addTab(wrapView(&WtHome::gitExample),
tr("git"));
examplesMenu_->addTab(wrapView(&WtHome::chatExample),
tr("chat"));
examplesMenu_->addTab(wrapView(&WtHome::composerExample),
tr("mail-composer"));
examplesMenu_->addTab(wrapView(&WtHome::hangmanExample),
tr("hangman"));
// Enable internal paths for the example menu
examplesMenu_->setInternalPathEnabled("/examples");
examplesMenu_->currentChanged().connect(this, &Home::googleAnalyticsLogger);

return std::move(result);
}

std::unique_ptr<WWidget> WtHome::createQuoteForm()
{
#ifdef WT_EMWEB_BUILD
return cpp14::make_unique<QuoteForm>(QuoteForm::Wt);
#else
return nullptr;
#endif
}

std::unique_ptr<WWidget> WtHome::sourceViewer(const std::string& deployPath)
{
return cpp14::make_unique<ExampleSourceViewer>(deployPath, wtExamplePath_ + "/", "CPP");
}

std::unique_ptr<WWidget> WtHome::wrapView(std::unique_ptr<WWidget> (WtHome::*createWidget)())
{
return makeStaticModel(std::bind(createWidget, this));
}

std::unique_ptr<WApplication> createWtHomeApplication(const WEnvironment& env,
Dbo::SqlConnectionPool *blogDb)
{
return cpp14::make_unique<WtHome>(env, *blogDb);
}
(3-3/5)