Fixed problems with block; refactored code
This commit is contained in:
140
src/app.cpp
140
src/app.cpp
@@ -399,8 +399,8 @@ std::unique_ptr<Wt::WText> App::createInfoText(Wt::Json::Object userData) {
|
||||
|
||||
std::unique_ptr<Wt::WPushButton> App::createBlockButton(Wt::Json::Object userData) {
|
||||
auto blockButton = std::make_unique<Wt::WPushButton>((bool)userData["blocked"] ? "Unblock user" : "Block user");
|
||||
blockButton->clicked().connect([=, this, &userData]() {
|
||||
server_.toggleBlockUser(userName, (std::string)userData["name"], userName);
|
||||
blockButton->clicked().connect([=, this]() mutable {
|
||||
server_.toggleBlockUser(userName, (std::string)userData["name"], sessionId());
|
||||
});
|
||||
return blockButton;
|
||||
}
|
||||
@@ -433,56 +433,69 @@ Wt::WLineEdit* App::createInputLine(Wt::WHBoxLayout* inputLayout) {
|
||||
Wt::WImage* App::createSendImageButton(Wt::WHBoxLayout* inputLayout) {
|
||||
auto sendImageButton = inputLayout->addNew<Wt::WImage>(Wt::WLink("/image.png"));
|
||||
sendImageButton->setToolTip("Send an image");
|
||||
sendImageButton->clicked().connect([=, this]() {
|
||||
auto fileDialog = root()->addNew<Wt::WDialog>("Send Image to User");
|
||||
auto layout = fileDialog->contents()->setLayout(std::make_unique<Wt::WVBoxLayout>());
|
||||
layout->addNew<Wt::WText>("Please select an immage");
|
||||
auto fileWidget = layout->addNew<Wt::WFileUpload>();
|
||||
fileWidget->setFilters("image/*");
|
||||
auto image = layout->addNew<Wt::WImage>();
|
||||
image->setMaximumSize(Wt::WLength(100, Wt::LengthUnit::Pixel), Wt::WLength(100, Wt::LengthUnit::Pixel));
|
||||
image->setHeight(Wt::WLength::Auto);
|
||||
auto localImage = std::make_shared<Magick::Image>();
|
||||
auto buttonsContainer = layout->addNew<Wt::WContainerWidget>();
|
||||
auto okButton = buttonsContainer->addNew<Wt::WPushButton>("Send image");
|
||||
fileWidget->uploaded().connect([=, this]() mutable {
|
||||
try {
|
||||
Magick::Image originalImage;
|
||||
originalImage.quiet(true);
|
||||
originalImage.read(fileWidget->spoolFileName());
|
||||
*localImage = scaleImage(originalImage, 500);
|
||||
auto smallImage = scaleImage(originalImage, 100);
|
||||
Magick::Blob previewBlob;
|
||||
smallImage.write(&previewBlob);
|
||||
auto previewBase64 = previewBlob.base64();
|
||||
auto previewImage = Wt::Utils::base64Decode(previewBase64);
|
||||
auto imageResource = std::make_shared<Wt::WMemoryResource>(
|
||||
"image/png",
|
||||
std::vector<unsigned char>(previewImage.begin(), previewImage.end()));
|
||||
image->setImageLink(Wt::WLink(imageResource));
|
||||
image->resize(Wt::WLength(smallImage.columns(), Wt::LengthUnit::Pixel), Wt::WLength(smallImage.rows(), Wt::LengthUnit::Pixel));
|
||||
okButton->setEnabled(true);
|
||||
triggerUpdate();
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << "Error processing uploaded image: " << e.what() << std::endl;
|
||||
}
|
||||
});
|
||||
fileWidget->changed().connect([=]() { fileWidget->upload(); });
|
||||
fileWidget->fileTooLarge().connect([](){ std::cout << "file too big" << std::endl; });
|
||||
okButton->setDisabled(true);
|
||||
okButton->clicked().connect([=, this]() {
|
||||
server_.addImage(sessionId(), currentConversationWith_, localImage);
|
||||
fileDialog->accept();
|
||||
});
|
||||
auto cancelButton = buttonsContainer->addNew<Wt::WPushButton>("Cancel");
|
||||
cancelButton->clicked().connect([=](){ fileDialog->reject(); });
|
||||
fileDialog->setClosable(true);
|
||||
fileDialog->setModal(true);
|
||||
fileDialog->show();
|
||||
});
|
||||
sendImageButton->clicked().connect(this, &App::sendImage);
|
||||
return sendImageButton;
|
||||
}
|
||||
|
||||
void App::sendImage() {
|
||||
auto fileDialog = root()->addNew<Wt::WDialog>("Send Image to User");
|
||||
auto layout = fileDialog->contents()->setLayout(std::make_unique<Wt::WVBoxLayout>());
|
||||
layout->addNew<Wt::WText>("Please select an immage");
|
||||
auto fileWidget = layout->addNew<Wt::WFileUpload>();
|
||||
fileWidget->setFilters("image/*");
|
||||
auto image = layout->addNew<Wt::WImage>();
|
||||
image->setMaximumSize(Wt::WLength(100, Wt::LengthUnit::Pixel), Wt::WLength(100, Wt::LengthUnit::Pixel));
|
||||
image->setHeight(Wt::WLength::Auto);
|
||||
auto localImage = std::make_shared<Magick::Image>();
|
||||
auto buttonsContainer = layout->addNew<Wt::WContainerWidget>();
|
||||
auto okButton = buttonsContainer->addNew<Wt::WPushButton>("Send image");
|
||||
fileWidget->uploaded().connect([=, this]() mutable {
|
||||
imageUploaded(fileWidget, localImage, image, okButton);
|
||||
});
|
||||
fileWidget->changed().connect([=]() { fileWidget->upload(); });
|
||||
fileWidget->fileTooLarge().connect([](){ std::cout << "file too big" << std::endl; });
|
||||
okButton->setDisabled(true);
|
||||
okButton->clicked().connect([=, this]() {
|
||||
server_.addImage(sessionId(), currentConversationWith_, localImage);
|
||||
fileDialog->accept();
|
||||
});
|
||||
auto cancelButton = buttonsContainer->addNew<Wt::WPushButton>("Cancel");
|
||||
cancelButton->clicked().connect([=](){ fileDialog->reject(); });
|
||||
fileDialog->setClosable(true);
|
||||
fileDialog->setModal(true);
|
||||
fileDialog->show();
|
||||
}
|
||||
|
||||
void App::imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Image> localImage, Wt::WImage *image, Wt::WPushButton *okButton) {
|
||||
try {
|
||||
std::list<Magick::Image> originalImages;
|
||||
Magick::readImages(&originalImages, fileWidget->spoolFileName());
|
||||
std::list<Magick::Image> coalescedList;
|
||||
Magick::coalesceImages(&coalescedList, originalImages.begin(), originalImages.end());
|
||||
Magick::Image coalescedImage;
|
||||
Magick::Blob coalescedBlob;
|
||||
Magick::writeImages(coalescedList.begin(), coalescedList.end(), &coalescedBlob);
|
||||
coalescedImage.read(coalescedBlob);
|
||||
*localImage = coalescedImage;
|
||||
Magick::Blob previewBlob;
|
||||
coalescedImage.write(&previewBlob);
|
||||
Magick::writeImages(coalescedList.begin(), coalescedList.end(), &previewBlob);
|
||||
auto previewBase64 = previewBlob.base64();
|
||||
auto previewImage = Wt::Utils::base64Decode(previewBase64);
|
||||
std::string imageFormat = coalescedImage.magick();
|
||||
auto imageResource = std::make_shared<Wt::WMemoryResource>(
|
||||
"image/" + imageFormat,
|
||||
std::vector<unsigned char>(previewImage.begin(), previewImage.end()));
|
||||
image->setImageLink(Wt::WLink(imageResource));
|
||||
image->resize(Wt::WLength(localImage->columns(), Wt::LengthUnit::Pixel), Wt::WLength(localImage->rows(), Wt::LengthUnit::Pixel));
|
||||
std::cout << __LINE__ << std::endl;
|
||||
okButton->setEnabled(true);
|
||||
triggerUpdate();
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << "Error processing uploaded image: " << e.what() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
Magick::Image App::scaleImage(const Magick::Image& originalImage, int maxSize) const {
|
||||
int scale = 100;
|
||||
int maxDimension = std::max(originalImage.size().width(), originalImage.size().height());
|
||||
@@ -654,8 +667,11 @@ Wt::WWebWidget* App::createImageElement(Wt::Json::Object& line, const std::strin
|
||||
imageLineItem->addNew<Wt::WText>(outputText)->setStyleClass("output-line");
|
||||
auto image = imageLineItem->addNew<Wt::WImage>();
|
||||
auto imageBlob = Wt::Utils::base64Decode((std::string)imageDescription["imageblobbase64"]);
|
||||
Magick::Image magickImage;
|
||||
magickImage.read(imageBlob);
|
||||
std::string imageFormat = magickImage.magick();
|
||||
auto imageResource = std::make_shared<Wt::WMemoryResource>(
|
||||
"image/png",
|
||||
"image/" + imageFormat,
|
||||
std::vector<unsigned char>(imageBlob.begin(), imageBlob.end()));
|
||||
image->setImageLink(Wt::WLink(imageResource));
|
||||
image->resize(Wt::WLength((int)imageDescription["width"], Wt::LengthUnit::Pixel), Wt::WLength((int)imageDescription["height"], Wt::LengthUnit::Pixel));
|
||||
@@ -749,8 +765,9 @@ void App::updateUserinfo(Wt::Json::Object data) {
|
||||
auto infoLayoutItem = containerLayout->itemAt(0);
|
||||
auto infoWidget = (Wt::WContainerWidget*)(infoLayoutItem->widget());
|
||||
auto infoWidgetLayout = (Wt::WHBoxLayout*)infoWidget->layout();
|
||||
auto infoTextWidget = dynamic_cast<Wt::WText*>(infoWidgetLayout->itemAt(0)->widget());
|
||||
auto blockButton = dynamic_cast<Wt::WPushButton*>(infoWidgetLayout->itemAt(1)->widget());
|
||||
auto infoTextWidget = dynamic_cast<Wt::WText*>(infoWidgetLayout->itemAt(1)->widget());
|
||||
auto blockButton = dynamic_cast<Wt::WPushButton*>(infoWidgetLayout->itemAt(2)->widget());
|
||||
std::cout << Wt::Json::serialize(userData) << std::endl;
|
||||
try {
|
||||
infoWidget->setStyleClass(Wt::WString("user-conversation-info userlist-gender-{1}").arg((std::string)userData["gender"]));
|
||||
if (infoTextWidget) {
|
||||
@@ -792,15 +809,20 @@ void App::toggleSmileysBar(Wt::WContainerWidget *smileyBar) {
|
||||
smileyBar->setHidden(!smileyBar->isHidden());
|
||||
}
|
||||
|
||||
void App::showSystemMessage(Wt::Json::Object broadcast) {
|
||||
if ((std::string)broadcast["relatedUser"] != currentConversationWith_) {
|
||||
void App::systemEvent(Wt::Json::Object broadcast) {
|
||||
if ((std::string)broadcast["related-user"] != currentConversationWith_) {
|
||||
return;
|
||||
}
|
||||
auto containerLayout = (Wt::WVBoxLayout*)contentContainer_->layout();
|
||||
auto outputLayoutItem = containerLayout->itemAt(1);
|
||||
auto outputContainer = (Wt::WContainerWidget*)outputLayoutItem->widget();
|
||||
auto outputLine = outputContainer->addNew<Wt::WText>((std::string)broadcast["data"]);
|
||||
outputLine->setStyleClass("system-message");
|
||||
auto infoLayoutItem = containerLayout->itemAt(0);
|
||||
auto infoWidget = (Wt::WContainerWidget*)(infoLayoutItem->widget());
|
||||
auto infoWidgetLayout = (Wt::WHBoxLayout*)infoWidget->layout();
|
||||
auto blockButton = dynamic_cast<Wt::WPushButton*>(infoWidgetLayout->itemAt(2)->widget());
|
||||
if (broadcast["data"] == "blocked") {
|
||||
blockButton->setText("Unblock");
|
||||
} else if (broadcast["data"] == "unblocked") {
|
||||
blockButton->setText("Block");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1219,7 +1241,7 @@ void App::incomingBroadcast() {
|
||||
} else if (broadcast["type"] == "userinfo") {
|
||||
updateUserinfo(broadcast);
|
||||
} else if (broadcast["type"] == "system") {
|
||||
showSystemMessage(broadcast);
|
||||
systemEvent(broadcast);
|
||||
} else if (broadcast["type"] == "conversation-start") {
|
||||
showConversation(broadcast);
|
||||
} else if (broadcast["type"] == "search-result") {
|
||||
|
||||
Reference in New Issue
Block a user