Wt examples 4.5.2
PopupChatWidget.C
Go to the documentation of this file.
1/*
2 * Copyright (C) 2010 Emweb bv, Herent, Belgium.
3 *
4 * See the LICENSE file for terms of use.
5 */
6
7#include <Wt/WApplication.h>
8#include <Wt/WEnvironment.h>
9#include <Wt/WImage.h>
10#include <Wt/WText.h>
11#include <Wt/WVBoxLayout.h>
12
13#include "PopupChatWidget.h"
14#include "SimpleChatServer.h"
15
16// TODO:
17// - i18n
18
20 const std::string& id)
21 : SimpleChatWidget(server),
22 missedMessages_(0)
23{
24 setId(id);
25
26 if (Wt::WApplication::instance()->environment().agentIsIE()) {
27 if (Wt::WApplication::instance()->environment().agent()
28 == Wt::UserAgent::IE6)
29 setPositionScheme(Wt::PositionScheme::Absolute);
30 else
31 setPositionScheme(Wt::PositionScheme::Fixed);
32 }
33
34 implementJavaScript
36 "{"
37 """var s = $('#" + id + "');"
38 """s.toggleClass('chat-maximized chat-minimized');"
39 "}");
40
41 online_ = false;
42 minimized_ = true;
43 setStyleClass("chat-widget chat-minimized");
44
45 clear();
46 addWidget(createBar());
48
49 connect();
50}
51
52void PopupChatWidget::setName(const Wt::WString& name)
53{
54 if (name.empty())
55 return;
56
57 if (online_) {
58 int tries = 1;
59 Wt::WString n = name;
60 while (!server().changeName(name_, n))
61 n = name + std::to_string(++tries);
62
63 name_ = n;
64 } else
65 name_ = name;
66}
67
68std::unique_ptr<Wt::WContainerWidget> PopupChatWidget::createBar()
69{
70 auto bar(std::make_unique<Wt::WContainerWidget>());
71 bar->setStyleClass("chat-bar");
72
73 auto toggleButton(std::make_unique<Wt::WText>());
74 toggleButton->setInline(false);
75 toggleButton->setStyleClass("chat-minmax");
76 bar->clicked().connect(this, &PopupChatWidget::toggleSize);
77 bar->clicked().connect(this, &PopupChatWidget::goOnline);
78
79 bar->addWidget(std::move(toggleButton));
80
81 title_ = bar->addWidget(std::make_unique<Wt::WText>());
82
83 bar_ = bar.get();
84
85 return bar;
86}
87
89{
91}
92
94{
95 if (!online_) {
96 online_ = true;
97
98 int tries = 1;
99 Wt::WString name = name_;
100 if (name.empty())
101 name = server().suggestGuest();
102
103 while (!startChat(name)) {
104 if (name_.empty())
105 name = server().suggestGuest();
106 else
107 name = name_ + std::to_string(++tries);
108 }
109
110 name_ = name;
111 }
112
113 missedMessages_ = 0;
114 bar_->removeStyleClass("alert");
115}
116
117void PopupChatWidget::createLayout(std::unique_ptr<Wt::WWidget> messages,
118 std::unique_ptr<Wt::WWidget> userList,
119 std::unique_ptr<Wt::WWidget> messageEdit,
120 std::unique_ptr<Wt::WWidget> sendButton,
121 std::unique_ptr<Wt::WWidget> logoutButton)
122{
123 auto layout(std::make_unique<Wt::WVBoxLayout>());
124 layout->setContentsMargins(0, 0, 0, 0);
125 layout->setSpacing(0);
126
127 auto bar = layout->addWidget(createBar());
128 bar->setMinimumSize(Wt::WLength::Auto, 20);
129 layout->addWidget(std::move(messages), 1);
130 layout->addWidget(std::move(messageEdit));
131
132 setLayout(std::move(layout));
133}
134
136{
138
139 int count = server().users().size();
140
141 if (!loggedIn()) {
142 if (count == 0)
143 title_->setText("Thoughts? Ventilate.");
144 else if (count == 1)
145 title_->setText("Chat: 1 user online");
146 else
147 title_->setText(Wt::WString("Chat: {1} users online").arg(count));
148 } else {
149 title_->setText(Wt::WString("Chat: <span class=\"self\">{1}</span>"
150 " <span class=\"online\">({2} user{3})</span>")
151 .arg(userName()).arg(count).arg(count == 1 ? "" : "s"));
152 }
153}
154
156{
157 if (loggedIn() && minimized()) {
159 if (missedMessages_ == 1) {
160 bar_->addStyleClass("alert");
161 }
162 }
163}
164
166{
167 return minimized_;
168}
virtual void newMessage()
PopupChatWidget(SimpleChatServer &server, const std::string &id)
std::unique_ptr< Wt::WContainerWidget > createBar()
void setName(const Wt::WString &name)
Wt::WString name_
virtual void updateUsers()
Wt::WWidget * bar_
virtual void createLayout(std::unique_ptr< WWidget > messages, std::unique_ptr< WWidget > userList, std::unique_ptr< WWidget > messageEdit, std::unique_ptr< WWidget > sendButton, std::unique_ptr< WWidget > logoutButton)
bool minimized() const
Wt::WText * title_
A simple chat server.
UserSet users()
Get the users currently logged in.
Wt::WString suggestGuest()
Get a suggestion for a guest user name.
A self-contained chat widget.
bool startChat(const Wt::WString &user)
Start a chat for the given user.
virtual void updateUsers()
SimpleChatServer & server()
bool loggedIn() const
void changeName(const Wt::WString &name)
const Wt::WString & userName() const

Generated on Wed Jan 12 2022 for the C++ Web Toolkit (Wt) by doxygen 1.9.3