GravatarApp(const WEnvironment& env): WApplication(env) { GravatarImage* gravatar = new GravatarImage("*****@*****.**", root()); new WBreak(root()); WLineEdit* email = new WLineEdit(root()); email->changed().connect(boost::bind(set_email, gravatar, email)); email->setText("*****@*****.**"); new WBreak(root()); WSlider* size = new WSlider(root()); size->setRange(1, 512); size->setValue(80); size->valueChanged().connect(boost::bind(set_size, gravatar, size)); new WBreak(root()); WButtonGroup* builtin = new WButtonGroup(this); builtin->addButton(new WRadioButton("default", root()), GravatarImage::DEFAULT); builtin->addButton(new WRadioButton("404", root()), GravatarImage::RETURN_404); builtin->addButton(new WRadioButton("mm", root()), GravatarImage::MM); builtin->addButton(new WRadioButton("identicon", root()), GravatarImage::IDENTICON); builtin->addButton(new WRadioButton("monsterid", root()), GravatarImage::MONSTERID); builtin->addButton(new WRadioButton("wavatar", root()), GravatarImage::WAVATAR); builtin->addButton(new WRadioButton("retro", root()), GravatarImage::RETRO); builtin->addButton(new WRadioButton("custom url", root()), 9000); WLineEdit* custom_url = new WLineEdit(root()); custom_url->setText("https://www.google.com/favicon.ico"); builtin->setCheckedButton(builtin->button(GravatarImage::DEFAULT)); builtin->checkedChanged().connect(boost::bind(set_default, gravatar, builtin, custom_url)); new WBreak(root()); WButtonGroup* rating = new WButtonGroup(this); rating->addButton(new WRadioButton("G", root()), GravatarImage::G); rating->addButton(new WRadioButton("PG", root()), GravatarImage::PG); rating->addButton(new WRadioButton("R", root()), GravatarImage::R); rating->addButton(new WRadioButton("X", root()), GravatarImage::X); rating->setCheckedButton(rating->button(GravatarImage::G)); rating->checkedChanged().connect(boost::bind(set_rating, gravatar, rating)); new WBreak(root()); WCheckBox* fd = new WCheckBox("Force default", root()); fd->checked().connect(boost::bind(&GravatarImage::set_force_default, gravatar, true)); fd->unChecked().connect(boost::bind(&GravatarImage::set_force_default, gravatar, false)); new WBreak(root()); WCheckBox* sr = new WCheckBox("Use https", root()); sr->setTristate(); sr->setCheckState(PartiallyChecked); sr->checked().connect(boost::bind(&GravatarImage::set_secure_requests, gravatar, GravatarImage::ALWAYS)); sr->unChecked().connect(boost::bind(&GravatarImage::set_secure_requests, gravatar, GravatarImage::NEVER)); }
DetailManipulation::DetailManipulation(bool enhance, WContainerWidget *parent) : WContainerWidget(parent), onlySmooth(!enhance) { resize(WLength::Auto, WLength::Auto); // Image bar prepareInputImages(); WContainerWidget *imageBar = new WContainerWidget; WVBoxLayout *imageBarLayout = new WVBoxLayout(); for (size_t i = 0; i < inputImages.size(); ++i) { WImage *img = inputImages[i]->getOriginalImage(); img->setStyleClass("image_button"); img->resize(160, 120); img->setAttributeValue("onMouseOver", "this.width=192; this.height=144;"); img->setAttributeValue("onMouseOut", "this.width=160; this.height=120;"); img->clicked().connect( boost::bind(&DetailManipulation::selectImage, this, i ) ); imageBarLayout->addWidget(img); } imageBar->resize(200, WLength::Auto); imageBar->setLayout(imageBarLayout); selectedImageId = 0; // Main component imageTab = new WTabWidget(); imageTab->addTab(inputImages[selectedImageId]->getOriginalImage(), "Original"); if (onlySmooth) { imageTab->addTab(new WImage(smoothedResult[selectedImageId].second), smoothedResult[selectedImageId].first); } else { imageTab->addTab(new WImage(enhancedResult[selectedImageId].second), enhancedResult[selectedImageId].first); } imageTab->resize(600, WLength::Auto); WGridLayout *controllerLayout = new WGridLayout(); WSlider *rSlider = new WSlider(Wt::Vertical); rSlider->setRange(SLIDER_MINIMUM, SLIDER_MAXIMUM); rSlider->setTickPosition(Wt::WSlider::TicksBothSides); WDoubleSpinBox *rSpinBox = new WDoubleSpinBox(); rSpinBox->setMinimum(R_MINIMUM); rSpinBox->setMaximum(R_MAXIMUM); rSlider->sliderMoved().connect( boost::bind(&DetailManipulation::changeDoubleSpinBoxValue, this, rSpinBox, true, _1) ); rSpinBox->valueChanged().connect( boost::bind(&DetailManipulation::changeSliderValue, this, rSlider, 1.f/(R_MAXIMUM-R_MINIMUM), _1) ); controllerLayout->addWidget(rSlider, 2, 0, 6, 1); controllerLayout->addWidget(rSpinBox, 9, 0); controllerLayout->addWidget(new WText("radius"), 10, 0); WSlider *epsSlider = new WSlider(Wt::Vertical); epsSlider->setMinimum(SLIDER_MINIMUM); epsSlider->setMaximum(SLIDER_MAXIMUM); epsSlider->setRange(SLIDER_MINIMUM, SLIDER_MAXIMUM); epsSlider->setTickPosition(WSlider::TicksBothSides); WDoubleSpinBox *epsSpinBox = new WDoubleSpinBox(); epsSpinBox->setMinimum(EPS_MINIMUM); epsSpinBox->setMaximum(EPS_MAXIMUM); epsSlider->sliderMoved().connect( boost::bind(&DetailManipulation::changeDoubleSpinBoxValue, this, epsSpinBox, false, _1) ); epsSpinBox->valueChanged().connect( boost::bind(&DetailManipulation::changeSliderValue, this, epsSlider, 1.f/(EPS_MAXIMUM-EPS_MINIMUM), _1) ); controllerLayout->addWidget(epsSlider, 2, 1, 6, 1); controllerLayout->addWidget(epsSpinBox, 9, 1); controllerLayout->addWidget(new WText("epsilon"), 10, 1); WPushButton *apply = new WPushButton("Apply"); apply->clicked().connect( boost::bind(&DetailManipulation::applyEnhancement, this, rSpinBox, epsSpinBox ) ); controllerLayout->addWidget(apply, 1, 0, 1, 2); WContainerWidget *controller = new WContainerWidget(); controller->resize(120, WLength::Auto); controller->setLayout(controllerLayout); WBorderLayout *mainLayout = new WBorderLayout(this); mainLayout->addWidget(imageBar, WBorderLayout::West); mainLayout->addWidget(imageTab, WBorderLayout::Center); mainLayout->addWidget(controller, WBorderLayout::East); //setLayout(mainLayout, Wt::AlignTop | Wt::AlignJustify); /* doJavaScript( "(function () { \ var imageTags = document.getElementsByClassName(\"image_button\"); \ for (var i=0; image=imageTags[i]; ++i) { \ if (image.width>200 && image.height>0) { \ image.width = 192; \ } \ }\ })();" );*/ }