Wt examples  4.0.0
PopupChatWidget.C
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2010 Emweb bvba, Heverlee, 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()
30  else
32  }
33 
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();
47  updateUsers();
48 
49  connect();
50 }
51 
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 
68 std::unique_ptr<Wt::WContainerWidget> PopupChatWidget::createBar()
69 {
70  auto bar(Wt::cpp14::make_unique<Wt::WContainerWidget>());
71  bar->setStyleClass("chat-bar");
72 
73  auto toggleButton(Wt::cpp14::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(Wt::cpp14::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 
117 void 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(Wt::cpp14::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()) {
158  ++missedMessages_;
159  if (missedMessages_ == 1) {
160  bar_->addStyleClass("alert");
161  }
162  }
163 }
164 
166 {
167  return minimized_;
168 }
void setLayout(std::unique_ptr< WLayout > layout)
virtual void setStyleClass(const WString &styleClass) override
virtual void newMessage()
virtual void setPositionScheme(PositionScheme scheme) override
bool loggedIn() const
Wt::WText * title_
const Wt::WString & userName() const
SimpleChatServer & server()
static WLength Auto
UserSet users()
Get the users currently logged in.
A self-contained chat widget.
virtual void setId(const std::string &id) override
Wt::WString name_
virtual void updateUsers()
std::unique_ptr< Wt::WContainerWidget > createBar()
virtual void removeStyleClass(const WString &styleClass, bool force=false)=0
bool changeName(const Wt::WString &user, const Wt::WString &newUser)
Changes the name.
Wt::WWidget * bar_
virtual void updateUsers()
bool setText(const WString &text)
bool startChat(const Wt::WString &user)
Start a chat for the given user.
bool minimized() const
WLayout * layout() const
virtual void clear()
Wt::WString suggestGuest()
Get a suggestion for a guest user name.
void setContentsMargins(int left, int top, int right, int bottom)
WStatelessSlot * implementJavaScript(void(T::*method)(), const std::string &jsCode)
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 empty() const
virtual int count() const
static WApplication * instance()
PopupChatWidget(SimpleChatServer &server, const std::string &id)
A simple chat server.
void setName(const Wt::WString &name)
virtual void addWidget(std::unique_ptr< WWidget > widget)
virtual void addStyleClass(const WString &styleClass, bool force=false)=0
void addWidget(std::unique_ptr< WWidget > widget)

Generated on Mon Sep 4 2017 for the C++ Web Toolkit (Wt) by doxygen 1.8.11