Project

General

Profile

Bug #5314 » test_20160928a_WStackedWidget_animation.C

Bruce Toll, 10/01/2016 04:46 AM

 
#include <Wt/WServer>
#include <Wt/WSignal>
#include <Wt/WAnimation>
#include <Wt/WStackedWidget>
#include <Wt/WFitLayout>
#include <Wt/WHBoxLayout>
#include <Wt/WAnimation>
#include <Wt/WText>
#include <Wt/WIcon>
#include <Wt/WBreak>
#include <Wt/WPushButton>
#include <Wt/WBootstrapTheme>

using namespace Wt;
class StackedWidget: public WStackedWidget
{
public:
StackedWidget(WContainerWidget *parent=0) : WStackedWidget(parent){ setLayoutSizeAware(true); }

void layoutSizeChanged(int width, int height) override {
// calculate number of smileys that will require scrolling with available space
int w = (std::max(width - 15, 90)) / 90;
int h = (std::max(height, 70) / 70) * 2;
smileys_ = "";
for (int i=0; i < w * h; ++i)
smileys_ += "<i class=\"fa fa-smile-o fa-5x fa-fw\"></i>";
WStackedWidget::layoutSizeChanged(width, height);
smileyChanged_.emit(smileys_);
}

Signal<std::string>& smileyChanged() { return smileyChanged_; }

private:
std::string smileys_;
Signal<std::string> smileyChanged_;
};


class TestApplication : public WApplication
{
public:
TestApplication(const WEnvironment& env);
void addButton(const WString &text, const WAnimation &animation);

private:
static constexpr int FadeTime = 3000;
WBootstrapTheme bs_theme_;
StackedWidget* sw_ = nullptr;
WText* smileyText_ = nullptr;
WContainerWidget* lhs_ = nullptr;
};

void TestApplication::addButton(const WString &text, const WAnimation &animation)
{
(new WPushButton(text, lhs_))->clicked().connect(std::bind([this, animation] {
sw_->setTransitionAnimation(animation);
sw_->setCurrentIndex(sw_->currentIndex() ^ 1);
}));
}

TestApplication::TestApplication(const WEnvironment& env) : WApplication(env)
{
setTitle("StackedWidget layout animation issue");
setTheme(&bs_theme_);
// workaround to load font-awesome icons...
WIcon("bars");

auto h_layout = new WHBoxLayout();
(new WFitLayout(root()))->addItem(h_layout);
h_layout->parentLayout()->setContentsMargins(0, 0, 0, 0);

lhs_ = new WContainerWidget();
new WText("<b>NOTES:</b><br/>"
"Look for loss of scrollbar after initial fade transition.<br/><br/>", lhs_);
addButton("Toggle StackedWidget (w/fade)", WAnimation(WAnimation::Fade, WAnimation::Linear, FadeTime));
addButton("Toggle StackedWidget", WAnimation());

h_layout->addWidget(lhs_);
h_layout->addWidget(sw_ = new StackedWidget(), 1);

auto sw0 = new WContainerWidget();
sw0->decorationStyle().setBackgroundColor(lightGray);
sw_->addWidget(sw0);

auto sw1 = new WContainerWidget();
sw1->setOverflow(WContainerWidget::OverflowAuto, Vertical);
smileyText_ = new WText(sw1);
sw_->addWidget(sw1);

sw_->smileyChanged().connect(std::bind([this] (std::string smileys) {
smileyText_->setText(smileys);
}, std::placeholders::_1));
}


int main(int argc, char **argv)
{
return WRun(argc, argv, [](const WEnvironment& env) {return new TestApplication(env);});
}
(1-1/3)