|  | #include <Wt/WApplication.h>
 | 
  
    |  | #include <Wt/WContainerWidget.h>
 | 
  
    |  | #include <Wt/WLink.h>
 | 
  
    |  | #include <Wt/WMessageBox.h>
 | 
  
    |  | #include <Wt/WPushButton.h>
 | 
  
    |  | #include <Wt/WSpinBox.h>
 | 
  
    |  | #include <Wt/WStackedWidget.h>
 | 
  
    |  | #include <Wt/WStreamResource.h>
 | 
  
    |  | #include <Wt/WText.h>
 | 
  
    |  | 
 | 
  
    |  | #include <iostream>
 | 
  
    |  | #include <memory>
 | 
  
    |  | #include <sstream>
 | 
  
    |  | 
 | 
  
    |  | class MY_APPLICATION;
 | 
  
    |  | 
 | 
  
    |  | class MY_RESOURCE : public Wt::WStreamResource
 | 
  
    |  | {
 | 
  
    |  | public:
 | 
  
    |  | 	explicit MY_RESOURCE(MY_APPLICATION * i_application) :
 | 
  
    |  | 		m_application(i_application)
 | 
  
    |  | 	{
 | 
  
    |  | 		setTakesUpdateLock(true);
 | 
  
    |  | 		
 | 
  
    |  | 		setMimeType("text/plain");
 | 
  
    |  | 		suggestFileName("data.txt");
 | 
  
    |  | 	}
 | 
  
    |  | 	
 | 
  
    |  | 	void handleRequest(const Wt::Http::Request & request, Wt::Http::Response & response) override;
 | 
  
    |  | 	
 | 
  
    |  | private:
 | 
  
    |  | 	MY_APPLICATION * m_application {nullptr};
 | 
  
    |  | };
 | 
  
    |  | 
 | 
  
    |  | class MY_APPLICATION : public Wt::WApplication
 | 
  
    |  | {
 | 
  
    |  | public:
 | 
  
    |  | 	explicit MY_APPLICATION(const Wt::WEnvironment & i_enviromment) :
 | 
  
    |  | 		WApplication(i_enviromment)
 | 
  
    |  | 	{
 | 
  
    |  | #ifdef NO_WIDGET_STACK		
 | 
  
    |  | 		auto container = root()->addWidget(std::make_unique<Wt::WContainerWidget>());
 | 
  
    |  | #else		
 | 
  
    |  | 		auto spin_box  = root()->addWidget(std::make_unique<Wt::WSpinBox>());
 | 
  
    |  | 		spin_box->setRange(0, 1);
 | 
  
    |  | 		auto main_stack = root()->addWidget(std::make_unique<Wt::WStackedWidget>());
 | 
  
    |  | 		spin_box->valueChanged().connect<Wt::WStackedWidget, Wt::WStackedWidget, int>(main_stack, & Wt::WStackedWidget::setCurrentIndex);
 | 
  
    |  | 		
 | 
  
    |  | 		main_stack->addWidget(std::make_unique<Wt::WText>("This is the boring page 0."));
 | 
  
    |  | 		auto container = main_stack->addWidget(std::make_unique<Wt::WContainerWidget>());
 | 
  
    |  | #endif
 | 
  
    |  | 
 | 
  
    |  | 		m_spin_box  = container->addWidget(std::make_unique<Wt::WSpinBox>());
 | 
  
    |  | 		
 | 
  
    |  | 		auto validate_button = container->addWidget(std::make_unique<Wt::WPushButton>("Validate"));
 | 
  
    |  | 		validate_button->clicked().connect(this, & MY_APPLICATION::validate);
 | 
  
    |  | 		
 | 
  
    |  | 		auto export_button = container->addWidget(std::make_unique<Wt::WPushButton>("Export"));
 | 
  
    |  | 		auto my_resource = std::make_shared<MY_RESOURCE>(this);
 | 
  
    |  | 		m_spin_box->valueChanged().connect(my_resource.get(), & Wt::WResource::setChanged);
 | 
  
    |  | 		export_button->setLink(Wt::WLink(my_resource));
 | 
  
    |  | 
 | 
  
    |  | 		enableUpdates(true);
 | 
  
    |  | 	}
 | 
  
    |  | 
 | 
  
    |  | 	void validate()
 | 
  
    |  | 	{
 | 
  
    |  | 		const int current_value = m_spin_box->value();
 | 
  
    |  | 		if (current_value == 0)
 | 
  
    |  | 		{
 | 
  
    |  | 			auto message_box = m_spin_box->addChild(std::make_unique<Wt::WMessageBox>(
 | 
  
    |  | 				"Error",
 | 
  
    |  | 				"Value must not be 0",
 | 
  
    |  | 				Wt::Icon::Critical,
 | 
  
    |  | 				Wt::StandardButton::Ok));
 | 
  
    |  | 
 | 
  
    |  | 			message_box->buttonClicked().connect([=] {m_spin_box->removeChild(message_box);});
 | 
  
    |  | 			message_box->show();
 | 
  
    |  | 		}
 | 
  
    |  | 	}
 | 
  
    |  | 
 | 
  
    |  | 	Wt::WSpinBox * m_spin_box {nullptr};
 | 
  
    |  | };
 | 
  
    |  | 
 | 
  
    |  | void MY_RESOURCE::handleRequest(const Wt::Http::Request & request, Wt::Http::Response & response)
 | 
  
    |  | {
 | 
  
    |  | 	m_application->validate();
 | 
  
    |  | 	m_application->triggerUpdate();
 | 
  
    |  | 	
 | 
  
    |  | 	std::stringstream stream;
 | 
  
    |  | 	stream	<< "Your data: " << m_application->m_spin_box->value();
 | 
  
    |  | 	handleRequestPiecewise(request, response, stream);
 | 
  
    |  | }
 | 
  
    |  | 
 | 
  
    |  | int main(int i_argc, char ** i_argv)
 | 
  
    |  | {
 | 
  
    |  | 	return Wt::WRun(i_argc, i_argv, [](const Wt::WEnvironment &env)
 | 
  
    |  | 	{
 | 
  
    |  | 	    return std::make_unique<MY_APPLICATION>(env);
 | 
  
    |  | 	});
 | 
  
    |  | }
 |