10#include <Wt/WApplication.h>
11#include <Wt/WContainerWidget.h>
12#include <Wt/WEnvironment.h>
13#include <Wt/WInPlaceEdit.h>
14#include <Wt/WHBoxLayout.h>
15#include <Wt/WVBoxLayout.h>
17#include <Wt/WLineEdit.h>
18#include <Wt/WTemplate.h>
20#include <Wt/WTextArea.h>
21#include <Wt/WPushButton.h>
22#include <Wt/WCheckBox.h>
47 Wt::WApplication::instance()->enableUpdates(
true);
53 Wt::WApplication::instance()->enableUpdates(
false);
62 auto hLayout_(std::make_unique<Wt::WHBoxLayout>());
65 Wt::AlignmentFlag::Top | Wt::AlignmentFlag::Left);
67 hLayout->addWidget(std::make_unique<Wt::WLabel>(
"User name:"),
68 0, Wt::AlignmentFlag::Middle);
71 0, Wt::AlignmentFlag::Middle);
74 auto button =
hLayout->addWidget(std::make_unique<Wt::WPushButton>(
"Login"),
75 0, Wt::AlignmentFlag::Middle);
81 statusMsg_->setTextFormat(Wt::TextFormat::Plain);
90 messageReceived_ = std::make_unique<Wt::WSound>(
"sounds/message_received.mp3");
94 "' is already taken.");
131 auto vLayout = std::make_unique<Wt::WVBoxLayout>();
134 auto hLayout = std::make_unique<Wt::WHBoxLayout>();
137 hLayout->setPreferredImplementation(Wt::LayoutImplementation::JavaScript);
140 messages->setStyleClass(
"chat-msgs");
144 userList->setStyleClass(
"chat-users");
147 hLayout->setResizable(0,
true);
157 hLayout = std::make_unique<Wt::WHBoxLayout>();
166 vLayout->addLayout(std::move(
hLayout), 0, Wt::AlignmentFlag::Left);
178 if (
flags.test(Wt::RenderFlag::Full)) {
184 +
messages_->jsRef() +
".scrollHeight;}, 0);");
188 WContainerWidget::render(
flags);
206 auto messagesPtr = std::make_unique<WContainerWidget>();
207 auto userListPtr = std::make_unique<WContainerWidget>();
209 auto sendButtonPtr = std::make_unique<Wt::WPushButton>(
"Send");
222 messages_->setOverflow(Wt::Overflow::Auto);
223 userList_->setOverflow(Wt::Overflow::Auto);
242 (
"function(o, e) { setTimeout(function() {"
255 Wt::WApplication::instance()->setConnectionMonitor(
257 "'onChange':function(type, newV) {"
258 "var connected = window.monitor.status.connectionStatus != 0;"
264 +
messageEdit_->jsRef() +
".placeholder='connection lost';"
289 auto nameEdit = std::make_unique<Wt::WInPlaceEdit>();
290 nameEdit->addStyleClass(
"name-edit");
295 Wt::WTemplate *
joinMsg =
messages_->addWidget(std::make_unique<Wt::WTemplate>(tr(
"join-msg.template")));
297 joinMsg->setStyleClass(
"chat-msg");
330 for (SimpleChatServer::UserSet::iterator
i = users.begin();
331 i != users.end(); ++
i) {
335 UserMap::const_iterator
j =
oldUsers.find(*
i);
337 w->setChecked(
j->second);
345 w->setStyleClass(
"chat-self");
360 Wt::WApplication *
app = Wt::WApplication::instance();
381 user_ =
event.data();
392 app->triggerUpdate();
407 Wt::WText *
w =
messages_->addWidget(std::make_unique<Wt::WText>());
412 if (!
w->setText(
event.formattedHTML(
user_, Wt::TextFormat::XHTML))) {
413 w->setText(
event.formattedHTML(
user_, Wt::TextFormat::Plain));
414 w->setTextFormat(Wt::TextFormat::XHTML);
418 w->setStyleClass(
"chat-msg");
430 +
messages_->jsRef() +
".scrollHeight;");
Wt::Auth::Dbo::UserDatabase< AuthInfo > UserDatabase
Encapsulate a chat event.
bool changeName(const Wt::WString &user, const Wt::WString &newUser)
Changes the name.
bool disconnect(Client *client)
Disconnect from the chat server.
UserSet users()
Get the users currently logged in.
void logout(const Wt::WString &user)
Logout from the server.
std::set< Wt::WString > UserSet
Typedef for a collection of user names.
bool connect(Client *client, const ChatEventCallback &handleEvent)
Connects to the chat server.
void sendMessage(const Wt::WString &user, const Wt::WString &message)
Send a message on behalve of a user.
Wt::WString suggestGuest()
Get a suggestion for a guest user name.
bool login(const Wt::WString &user)
Try to login with given user name.