Refactor widget creation in app.cpp to use std::make_unique for Wt::WContainerWidget and Wt::WText, improving memory management and code clarity.

This commit is contained in:
Torsten Schulz (local)
2025-11-16 14:28:29 +01:00
parent 24275a70b0
commit 4aa0089434

View File

@@ -245,7 +245,7 @@ Wt::WVBoxLayout *App::createVerticalLayout() {
} }
Wt::WHBoxLayout *App::createActionLayout(Wt::WVBoxLayout *verticalContainer) { Wt::WHBoxLayout *App::createActionLayout(Wt::WVBoxLayout *verticalContainer) {
auto horizontalBox = verticalContainer->addNew<Wt::WContainerWidget>(); auto horizontalBox = verticalContainer->addWidget(std::make_unique<Wt::WContainerWidget>());
horizontalBox->setStyleClass("horizontal-box"); horizontalBox->setStyleClass("horizontal-box");
auto horizontalContainer = horizontalBox->setLayout(std::make_unique<Wt::WHBoxLayout>()); auto horizontalContainer = horizontalBox->setLayout(std::make_unique<Wt::WHBoxLayout>());
horizontalContainer->setContentsMargins(0, 0, 0, 0); horizontalContainer->setContentsMargins(0, 0, 0, 0);
@@ -254,7 +254,7 @@ Wt::WHBoxLayout *App::createActionLayout(Wt::WVBoxLayout *verticalContainer) {
} }
void App::createHeadContainer(Wt::WVBoxLayout *layout) { void App::createHeadContainer(Wt::WVBoxLayout *layout) {
auto header = layout->addNew<Wt::WContainerWidget>(); auto header = layout->addWidget(std::make_unique<Wt::WContainerWidget>());
header->addNew<Wt::WText>("<h1>ypChat</h1>")->setInline(true); header->addNew<Wt::WText>("<h1>ypChat</h1>")->setInline(true);
header->addNew<Wt::WText>((std::string)"<script async src=""https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1104166651501135"" " + header->addNew<Wt::WText>((std::string)"<script async src=""https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1104166651501135"" " +
" crossorigin=""anonymous""></script>" + " crossorigin=""anonymous""></script>" +
@@ -272,7 +272,7 @@ void App::createHeadContainer(Wt::WVBoxLayout *layout) {
} }
void App::createMenuContainer(Wt::WVBoxLayout *layout) { void App::createMenuContainer(Wt::WVBoxLayout *layout) {
menuContainer_ = layout->addNew<Wt::WContainerWidget>(); menuContainer_ = layout->addWidget(std::make_unique<Wt::WContainerWidget>());
menuContainer_->setStyleClass("menu"); menuContainer_->setStyleClass("menu");
} }
@@ -438,7 +438,7 @@ void App::updateUserlist(Wt::Json::Array unsortedUserList, int size) {
layout->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0);
userListContainer_->setOverflow(Wt::Overflow::Auto, Wt::Orientation::Vertical); userListContainer_->setOverflow(Wt::Overflow::Auto, Wt::Orientation::Vertical);
userListContainer_->setOverflow(Wt::Overflow::Hidden, Wt::Orientation::Horizontal); userListContainer_->setOverflow(Wt::Overflow::Hidden, Wt::Orientation::Horizontal);
layout->addNew<Wt::WText>(Wt::WString("Logged in: {1}").arg(size)); layout->addWidget(std::make_unique<Wt::WText>(Wt::WString("Logged in: {1}").arg(size)));
auto sortedUserList = sortUserList(unsortedUserList); auto sortedUserList = sortUserList(unsortedUserList);
for (Wt::Json::Object &user: sortedUserList) { for (Wt::Json::Object &user: sortedUserList) {
addUserItemToLayout(layout, user); addUserItemToLayout(layout, user);
@@ -519,11 +519,12 @@ void App::setupConversationUI(Wt::Json::Object userData) {
} }
Wt::WContainerWidget* App::createInfoWidget(Wt::WVBoxLayout *layout, Wt::Json::Object userData) { Wt::WContainerWidget* App::createInfoWidget(Wt::WVBoxLayout *layout, Wt::Json::Object userData) {
auto infoWidget = layout->addNew<Wt::WContainerWidget>(); auto infoWidget = layout->addWidget(std::make_unique<Wt::WContainerWidget>());
try { try {
auto infoLayout = infoWidget->setLayout(std::make_unique<Wt::WHBoxLayout>()); auto infoLayout = infoWidget->setLayout(std::make_unique<Wt::WHBoxLayout>());
infoWidget->setStyleClass(Wt::WString("user-conversation-info userlist-gender-{1}").arg((std::string)userData["gender"])); infoWidget->setStyleClass(Wt::WString("user-conversation-info userlist-gender-{1}").arg((std::string)userData["gender"]));
auto flag = infoLayout->addNew<Wt::WImage>(Wt::WLink(std::make_shared<Wt::WFileResource>("../docroot/flags/" + (std::string)userData["isoCountryCode"] + ".png"))); auto flag = infoLayout->addWidget(std::make_unique<Wt::WImage>(
Wt::WLink(std::make_shared<Wt::WFileResource>("../docroot/flags/" + (std::string)userData["isoCountryCode"] + ".png"))));
flag->setToolTip(country); flag->setToolTip(country);
flag->setStyleClass("flag-icon"); flag->setStyleClass("flag-icon");
infoLayout->addWidget(createInfoText(userData), 1); infoLayout->addWidget(createInfoText(userData), 1);
@@ -549,7 +550,7 @@ std::unique_ptr<Wt::WPushButton> App::createBlockButton(Wt::Json::Object userDat
} }
Wt::WContainerWidget* App::createInputContainer(Wt::WVBoxLayout* layout) { Wt::WContainerWidget* App::createInputContainer(Wt::WVBoxLayout* layout) {
auto inputContainer = layout->addNew<Wt::WContainerWidget>(); auto inputContainer = layout->addWidget(std::make_unique<Wt::WContainerWidget>());
auto inputLayout = inputContainer->setLayout(std::make_unique<Wt::WHBoxLayout>()); auto inputLayout = inputContainer->setLayout(std::make_unique<Wt::WHBoxLayout>());
auto inputLine = createInputLine(inputLayout); auto inputLine = createInputLine(inputLayout);
inputLine->setFocus(); inputLine->setFocus();
@@ -574,7 +575,7 @@ Wt::WLineEdit* App::createInputLine(Wt::WHBoxLayout* inputLayout) {
} }
Wt::WImage* App::createSendImageButton(Wt::WHBoxLayout* inputLayout) { Wt::WImage* App::createSendImageButton(Wt::WHBoxLayout* inputLayout) {
auto sendImageButton = inputLayout->addNew<Wt::WImage>(Wt::WLink("/image.png")); auto sendImageButton = inputLayout->addWidget(std::make_unique<Wt::WImage>(Wt::WLink("/image.png")));
sendImageButton->setToolTip("Send an image"); sendImageButton->setToolTip("Send an image");
sendImageButton->clicked().connect(this, &App::sendImage); sendImageButton->clicked().connect(this, &App::sendImage);
return sendImageButton; return sendImageButton;
@@ -583,14 +584,14 @@ Wt::WImage* App::createSendImageButton(Wt::WHBoxLayout* inputLayout) {
void App::sendImage() { void App::sendImage() {
auto fileDialog = root()->addNew<Wt::WDialog>("Send Image to User"); auto fileDialog = root()->addNew<Wt::WDialog>("Send Image to User");
auto layout = fileDialog->contents()->setLayout(std::make_unique<Wt::WVBoxLayout>()); auto layout = fileDialog->contents()->setLayout(std::make_unique<Wt::WVBoxLayout>());
layout->addNew<Wt::WText>("Please select an immage"); layout->addWidget(std::make_unique<Wt::WText>("Please select an immage"));
auto fileWidget = layout->addNew<Wt::WFileUpload>(); auto fileWidget = layout->addWidget(std::make_unique<Wt::WFileUpload>());
fileWidget->setFilters("image/*"); fileWidget->setFilters("image/*");
auto image = layout->addNew<Wt::WImage>(); auto image = layout->addWidget(std::make_unique<Wt::WImage>());
image->setMaximumSize(Wt::WLength(100, Wt::LengthUnit::Pixel), Wt::WLength(100, Wt::LengthUnit::Pixel)); image->setMaximumSize(Wt::WLength(100, Wt::LengthUnit::Pixel), Wt::WLength(100, Wt::LengthUnit::Pixel));
image->setHeight(Wt::WLength::Auto); image->setHeight(Wt::WLength::Auto);
auto localImage = std::make_shared<Magick::Blob>(); auto localImage = std::make_shared<Magick::Blob>();
auto buttonsContainer = layout->addNew<Wt::WContainerWidget>(); auto buttonsContainer = layout->addWidget(std::make_unique<Wt::WContainerWidget>());
auto okButton = buttonsContainer->addNew<Wt::WPushButton>("Send image"); auto okButton = buttonsContainer->addNew<Wt::WPushButton>("Send image");
fileWidget->uploaded().connect([=, this]() mutable { fileWidget->uploaded().connect([=, this]() mutable {
imageUploaded(fileWidget, localImage, image, okButton); imageUploaded(fileWidget, localImage, image, okButton);
@@ -924,7 +925,7 @@ Wt::WWebWidget* App::createTextElement(const std::string& writer, const std::str
} }
void App::createImprintContainer(Wt::WVBoxLayout *containerLayout) { void App::createImprintContainer(Wt::WVBoxLayout *containerLayout) {
auto imprintContainer = containerLayout->addNew<Wt::WContainerWidget>(); auto imprintContainer = containerLayout->addWidget(std::make_unique<Wt::WContainerWidget>());
imprintContainer->setContentAlignment(Wt::AlignmentFlag::Justify); imprintContainer->setContentAlignment(Wt::AlignmentFlag::Justify);
imprintContainer->setPadding(Wt::WLength(0.5, Wt::LengthUnit::FontEm)); imprintContainer->setPadding(Wt::WLength(0.5, Wt::LengthUnit::FontEm));
auto partnerPagesButton = imprintContainer->addNew<Wt::WText>("Partners"); auto partnerPagesButton = imprintContainer->addNew<Wt::WText>("Partners");
@@ -1208,7 +1209,7 @@ Wt::WVBoxLayout *App::resetSearchFields() {
contentContainer_->clear(); contentContainer_->clear();
inboxOpen_ = false; inboxOpen_ = false;
auto contentLayout = contentContainer_->setLayout(std::make_unique<Wt::WVBoxLayout>()); auto contentLayout = contentContainer_->setLayout(std::make_unique<Wt::WVBoxLayout>());
contentLayout->addNew<Wt::WText>("<h2>Search</h2>"); contentLayout->addWidget(std::make_unique<Wt::WText>("<h2>Search</h2>"));
return contentLayout; return contentLayout;
} }
@@ -1272,7 +1273,7 @@ void App::addItem(const std::string& country, Wt::WContainerWidget *dropDownCont
void App::addUserItemToLayout(Wt::WVBoxLayout *layout, Wt::Json::Object userObject) { void App::addUserItemToLayout(Wt::WVBoxLayout *layout, Wt::Json::Object userObject) {
auto userName = (std::string)userObject["name"]; auto userName = (std::string)userObject["name"];
auto line = layout->addNew<Wt::WContainerWidget>(); auto line = layout->addWidget(std::make_unique<Wt::WContainerWidget>());
auto flag = line->addNew<Wt::WImage>(Wt::WLink(std::make_shared<Wt::WFileResource>("../docroot/flags/" + (std::string)userObject["isoCountryCode"] + ".png"))); auto flag = line->addNew<Wt::WImage>(Wt::WLink(std::make_shared<Wt::WFileResource>("../docroot/flags/" + (std::string)userObject["isoCountryCode"] + ".png")));
flag->setMaximumSize(Wt::WLength(60, Wt::LengthUnit::Pixel), Wt::WLength(20, Wt::LengthUnit::Pixel)); flag->setMaximumSize(Wt::WLength(60, Wt::LengthUnit::Pixel), Wt::WLength(20, Wt::LengthUnit::Pixel));
flag->setHeight(Wt::WLength(2, Wt::LengthUnit::FontEm)); flag->setHeight(Wt::WLength(2, Wt::LengthUnit::FontEm));
@@ -1578,12 +1579,12 @@ void App::startChat() {
} }
void App::createUserListContainer(Wt::WHBoxLayout *layout) { void App::createUserListContainer(Wt::WHBoxLayout *layout) {
userListContainer_ = layout->addNew<Wt::WContainerWidget>(); userListContainer_ = layout->addWidget(std::make_unique<Wt::WContainerWidget>());
userListContainer_->setStyleClass("userlist"); userListContainer_->setStyleClass("userlist");
} }
void App::createContentContainer(Wt::WHBoxLayout *layout) { void App::createContentContainer(Wt::WHBoxLayout *layout) {
contentContainer_ = layout->addNew<Wt::WContainerWidget>(); contentContainer_ = layout->addWidget(std::make_unique<Wt::WContainerWidget>());
contentContainer_->setStyleClass("content"); contentContainer_->setStyleClass("content");
} }
@@ -1672,13 +1673,14 @@ bool App::isNickAllowed(const std::string& nick) {
template<class Class> template<class Class>
Class *App::addSearchItemLine(Wt::WVBoxLayout *layout, std::string label, std::unique_ptr<Wt::WContainerWidget> additionalItem) { Class *App::addSearchItemLine(Wt::WVBoxLayout *layout, std::string label, std::unique_ptr<Wt::WContainerWidget> additionalItem) {
auto lineContainer = layout->addNew<Wt::WContainerWidget>(); auto lineContainer = layout->addWidget(std::make_unique<Wt::WContainerWidget>());
lineContainer->setStyleClass("search-line"); lineContainer->setStyleClass("search-line");
lineContainer->setPositionScheme(Wt::PositionScheme::Relative); lineContainer->setPositionScheme(Wt::PositionScheme::Relative);
auto lineLayout = lineContainer->setLayout(std::make_unique<Wt::WHBoxLayout>()); auto lineLayout = lineContainer->setLayout(std::make_unique<Wt::WHBoxLayout>());
lineContainer->setPadding(Wt::WLength("0")); lineContainer->setPadding(Wt::WLength("0"));
lineContainer->setMargin(Wt::WLength("0")); lineContainer->setMargin(Wt::WLength("0"));
lineLayout->addNew<Wt::WText>(label)->setWidth(Wt::WLength(9, Wt::LengthUnit::FontEm)); auto labelWidget = lineLayout->addWidget(std::make_unique<Wt::WText>(label));
labelWidget->setWidth(Wt::WLength(9, Wt::LengthUnit::FontEm));
lineLayout->setContentsMargins(0, 0, 0, 0); lineLayout->setContentsMargins(0, 0, 0, 0);
lineLayout->setSpacing(0); lineLayout->setSpacing(0);
auto input = std::make_unique<Class>(); auto input = std::make_unique<Class>();