Wt examples
4.10.4
Loading...
Searching...
No Matches
simplechat
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
19
PopupChatWidget::PopupChatWidget
(
SimpleChatServer
& server,
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
35
(&
PopupChatWidget::toggleSize
,
36
"{"
37
""
"let s = "
WT_CLASS
".$('"
+
id
+
"');"
38
""
"s.classList.toggle('chat-maximized');"
39
""
"s.classList.toggle('chat-minimized');"
40
"}"
);
41
42
online_
=
false
;
43
minimized_
=
true
;
44
setStyleClass
(
"chat-widget chat-minimized"
);
45
46
clear
();
47
addWidget(
createBar
());
48
updateUsers
();
49
50
connect
();
51
}
52
53
void
PopupChatWidget::setName
(
const
Wt::WString& name)
54
{
55
if
(name.empty())
56
return
;
57
58
if
(
online_
) {
59
int
tries
= 1;
60
Wt::WString
n
= name;
61
while
(!
server
().
changeName
(
name_
,
n
))
62
n
= name + std::to_string(++
tries
);
63
64
name_
=
n
;
65
}
else
66
name_
= name;
67
}
68
69
std::unique_ptr<Wt::WContainerWidget>
PopupChatWidget::createBar
()
70
{
71
auto
bar
(std::make_unique<Wt::WContainerWidget>());
72
bar
->setStyleClass(
"chat-bar"
);
73
74
auto
toggleButton
(std::make_unique<Wt::WText>());
75
toggleButton
->setInline(
false
);
76
toggleButton
->setStyleClass(
"chat-minmax"
);
77
bar
->clicked().connect(
this
, &
PopupChatWidget::toggleSize
);
78
bar
->clicked().connect(
this
, &
PopupChatWidget::goOnline
);
79
80
bar
->addWidget(std::move(
toggleButton
));
81
82
title_
=
bar
->addWidget(std::make_unique<Wt::WText>());
83
84
bar_
=
bar
.get();
85
86
return
bar
;
87
}
88
89
void
PopupChatWidget::toggleSize
()
90
{
91
minimized_
= !
minimized_
;
92
}
93
94
void
PopupChatWidget::goOnline
()
95
{
96
if
(!
online_
) {
97
online_
=
true
;
98
99
int
tries
= 1;
100
Wt::WString name =
name_
;
101
if
(name.empty())
102
name =
server
().
suggestGuest
();
103
104
while
(!
startChat
(name)) {
105
if
(
name_
.empty())
106
name =
server
().
suggestGuest
();
107
else
108
name =
name_
+ std::to_string(++
tries
);
109
}
110
111
name_
= name;
112
}
113
114
missedMessages_
= 0;
115
bar_
->removeStyleClass(
"alert"
);
116
}
117
118
void
PopupChatWidget::createLayout
(std::unique_ptr<Wt::WWidget>
messages
,
119
std::unique_ptr<Wt::WWidget>
userList
,
120
std::unique_ptr<Wt::WWidget>
messageEdit
,
121
std::unique_ptr<Wt::WWidget>
sendButton
,
122
std::unique_ptr<Wt::WWidget>
logoutButton
)
123
{
124
auto
layout
(std::make_unique<Wt::WVBoxLayout>());
125
layout
->setContentsMargins(0, 0, 0, 0);
126
layout
->setSpacing(0);
127
128
auto
bar
=
layout
->addWidget(
createBar
());
129
bar
->setMinimumSize(Wt::WLength::Auto, 20);
130
layout
->addWidget(std::move(
messages
), 1);
131
layout
->addWidget(std::move(
messageEdit
));
132
133
setLayout
(std::move(
layout
));
134
}
135
136
void
PopupChatWidget::updateUsers
()
137
{
138
SimpleChatWidget::updateUsers
();
139
140
int
count
=
server
().
users
().size();
141
142
if
(!
loggedIn
()) {
143
if
(
count
== 0)
144
title_
->setText(
"Thoughts? Ventilate."
);
145
else
if
(
count
== 1)
146
title_
->setText(
"Chat: 1 user online"
);
147
else
148
title_
->setText(Wt::WString(
"Chat: {1} users online"
).
arg
(
count
));
149
}
else
{
150
title_
->setText(Wt::WString(
"Chat: <span class=\"self\">{1}</span>"
151
" <span class=\"online\">({2} user{3})</span>"
)
152
.
arg
(
userName
()).
arg
(
count
).
arg
(
count
== 1 ?
""
:
"s"
));
153
}
154
}
155
156
void
PopupChatWidget::newMessage
()
157
{
158
if
(
loggedIn
() &&
minimized
()) {
159
++
missedMessages_
;
160
if
(
missedMessages_
== 1) {
161
bar_
->addStyleClass(
"alert"
);
162
}
163
}
164
}
165
166
bool
PopupChatWidget::minimized
()
const
167
{
168
return
minimized_
;
169
}
PopupChatWidget.h
UserDatabase
Wt::Auth::Dbo::UserDatabase< AuthInfo > UserDatabase
Definition
Session.h:22
SimpleChatServer.h
PopupChatWidget::online_
bool online_
Definition
PopupChatWidget.h:39
PopupChatWidget::newMessage
virtual void newMessage()
Definition
PopupChatWidget.C:156
PopupChatWidget::PopupChatWidget
PopupChatWidget(SimpleChatServer &server, const std::string &id)
Definition
PopupChatWidget.C:19
PopupChatWidget::minimized_
bool minimized_
Definition
PopupChatWidget.h:39
PopupChatWidget::createBar
std::unique_ptr< Wt::WContainerWidget > createBar()
Definition
PopupChatWidget.C:69
PopupChatWidget::setName
void setName(const Wt::WString &name)
Definition
PopupChatWidget.C:53
PopupChatWidget::toggleSize
void toggleSize()
Definition
PopupChatWidget.C:89
PopupChatWidget::name_
Wt::WString name_
Definition
PopupChatWidget.h:36
PopupChatWidget::updateUsers
virtual void updateUsers()
Definition
PopupChatWidget.C:136
PopupChatWidget::bar_
Wt::WWidget * bar_
Definition
PopupChatWidget.h:38
PopupChatWidget::createLayout
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)
Definition
PopupChatWidget.C:118
PopupChatWidget::minimized
bool minimized() const
Definition
PopupChatWidget.C:166
PopupChatWidget::goOnline
void goOnline()
Definition
PopupChatWidget.C:94
PopupChatWidget::missedMessages_
int missedMessages_
Definition
PopupChatWidget.h:40
PopupChatWidget::title_
Wt::WText * title_
Definition
PopupChatWidget.h:37
SimpleChatServer
A simple chat server.
Definition
SimpleChatServer.h:85
SimpleChatServer::users
UserSet users()
Get the users currently logged in.
Definition
SimpleChatServer.C:178
SimpleChatServer::suggestGuest
Wt::WString suggestGuest()
Get a suggestion for a guest user name.
Definition
SimpleChatServer.C:134
SimpleChatWidget
A self-contained chat widget.
Definition
SimpleChatWidget.h:28
SimpleChatWidget::startChat
bool startChat(const Wt::WString &user)
Start a chat for the given user.
Definition
SimpleChatWidget.C:191
SimpleChatWidget::updateUsers
virtual void updateUsers()
Definition
SimpleChatWidget.C:320
SimpleChatWidget::server
SimpleChatServer & server()
Definition
SimpleChatWidget.h:54
SimpleChatWidget::connect
void connect()
Definition
SimpleChatWidget.C:43
SimpleChatWidget::loggedIn
bool loggedIn() const
Definition
SimpleChatWidget.C:171
SimpleChatWidget::changeName
void changeName(const Wt::WString &name)
Definition
SimpleChatWidget.C:306
SimpleChatWidget::userName
const Wt::WString & userName() const
Definition
SimpleChatWidget.h:58
Generated on Tue Mar 26 2024 for
the C++ Web Toolkit (Wt)
by
1.10.0