Wt examples  4.0.0
HangmanGame.C
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 Emweb bvba, Heverlee, Belgium
3  *
4  * See the LICENSE file for terms of use.
5  */
6 
7 #include <Wt/WAnchor.h>
8 #include <Wt/WText.h>
9 #include <Wt/WStackedWidget.h>
10 #include <Wt/WVBoxLayout.h>
11 #include <Wt/WHBoxLayout.h>
12 #include <Wt/WApplication.h>
13 #include <Wt/Auth/AuthWidget.h>
14 #include <Wt/Auth/RegistrationModel.h>
15 
16 #include "HangmanGame.h"
17 #include "HangmanWidget.h"
18 #include "HighScoresWidget.h"
19 
22  game_(0),
23  scores_(0)
24 {
26 
27  std::unique_ptr<Auth::AuthModel> authModel
28  = cpp14::make_unique<Auth::AuthModel>(Session::auth(), session_.users());
29  authModel->addPasswordAuth(&Session::passwordAuth());
30  authModel->addOAuth(Session::oAuth());
31 
32  std::unique_ptr<Auth::AuthWidget> authWidget
33  = cpp14::make_unique<Auth::AuthWidget>(session_.login());
34  auto authWidgetPtr = authWidget.get();
35  authWidget->setModel(std::move(authModel));
36  authWidget->setRegistrationEnabled(true);
37 
38  std::unique_ptr<WText> title(cpp14::make_unique<WText>("<h1>A Witty game: Hangman</h1>"));
39  addWidget(std::move(title));
40 
41  addWidget(std::move(authWidget));
42 
43  mainStack_ = new WStackedWidget();
44  mainStack_->setStyleClass("gamestack");
45  addWidget(std::unique_ptr<WStackedWidget>(mainStack_));
46 
47  links_ = new WContainerWidget();
48  links_->setStyleClass("links");
49  links_->hide();
50  addWidget(std::unique_ptr<WContainerWidget>(links_));
51 
52  backToGameAnchor_ = links_->addWidget(cpp14::make_unique<WAnchor>("/play", "Gaming Grounds"));
53  backToGameAnchor_->setLink(WLink(LinkType::InternalPath, "/play"));
54 
55  scoresAnchor_ = links_->addWidget(cpp14::make_unique<WAnchor>("/highscores", "Highscores"));
56  scoresAnchor_->setLink(WLink(LinkType::InternalPath, "/highscores"));
57 
58  WApplication::instance()->internalPathChanged()
59  .connect(this, &HangmanGame::handleInternalPath);
60 
61  authWidgetPtr->processEnvironment();
62 }
63 
65 {
66  if (session_.login().loggedIn()) {
67  links_->show();
68  handleInternalPath(WApplication::instance()->internalPath());
69  } else {
70  mainStack_->clear();
71  game_ = 0;
72  scores_ = 0;
73  links_->hide();
74  }
75 }
76 
77 void HangmanGame::handleInternalPath(const std::string &internalPath)
78 {
79  if (session_.login().loggedIn()) {
80  if (internalPath == "/play")
81  showGame();
82  else if (internalPath == "/highscores")
84  else
85  WApplication::instance()->setInternalPath("/play", true);
86  }
87 }
88 
90 {
91  if (!scores_)
92  scores_ = mainStack_->addWidget(cpp14::make_unique<HighScoresWidget>(&session_));
93 
95  scores_->update();
96 
97  backToGameAnchor_->removeStyleClass("selected-link");
98  scoresAnchor_->addStyleClass("selected-link");
99 }
100 
102 {
103  if (!game_) {
104  game_ = mainStack_->addWidget(cpp14::make_unique<HangmanWidget>(session_.userName()));
105  game_->scoreUpdated().connect(std::bind(&Session::addToScore,&session_,std::placeholders::_1));
106  }
107 
109 
110  backToGameAnchor_->addStyleClass("selected-link");
111  scoresAnchor_->removeStyleClass("selected-link");
112 }
void showHighScores()
Definition: HangmanGame.C:89
virtual void setStyleClass(const WString &styleClass) override
virtual void addWidget(std::unique_ptr< WWidget > widget) override
Session session_
Definition: HangmanGame.h:41
void showGame()
Definition: HangmanGame.C:101
Auth::AbstractUserDatabase & users()
Definition: Session.C:207
bool loggedIn() const
WStackedWidget * mainStack_
Definition: HangmanGame.h:34
void setCurrentWidget(WWidget *widget)
WAnchor * backToGameAnchor_
Definition: HangmanGame.h:38
Signal & changed()
virtual void removeStyleClass(const WString &styleClass, bool force=false) override
static const Auth::AuthService & auth()
Definition: Session.C:212
virtual void addStyleClass(const WString &styleClass, bool force=false) override
virtual void clear()
Auth::Login & login()
Definition: Session.h:34
HangmanWidget * game_
Definition: HangmanGame.h:35
static const std::vector< const Auth::OAuthService * > & oAuth()
Definition: Session.C:222
void setLink(const WLink &link)
HighScoresWidget * scores_
Definition: HangmanGame.h:36
WContainerWidget * links_
Definition: HangmanGame.h:37
WAnchor * scoresAnchor_
Definition: HangmanGame.h:39
static const Auth::AbstractPasswordService & passwordAuth()
Definition: Session.C:217
void handleInternalPath(const std::string &internalPath)
Definition: HangmanGame.C:77
virtual Wt::Signals::connection connect(WObject *target, WObject::Method method) override
void addToScore(int s)
Definition: Session.C:155
Wt::Signal< int > & scoreUpdated()
Definition: HangmanWidget.h:25
virtual void addWidget(std::unique_ptr< WWidget > widget)
void onAuthEvent()
Definition: HangmanGame.C:64
std::string userName() const
Definition: Session.C:147

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