-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathController.cpp
More file actions
113 lines (104 loc) · 2.82 KB
/
Controller.cpp
File metadata and controls
113 lines (104 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "Controller.hpp"
#include "Model.hpp"
Controller::Controller(View &view, Model &model)
: m_view{view}, m_model{model} {}
void Controller::onEvent(const sf::Event &event) {
switch (event.type) {
case sf::Event::Closed:
m_view.closeWindow();
return;
case sf::Event::MouseButtonPressed:
onMouseButtonPressed(event.mouseButton);
return;
case sf::Event::MouseWheelScrolled:
onMouseWheelScrolled(event.mouseWheelScroll);
return;
case sf::Event::KeyPressed:
onKeyPressed(event.key);
return;
default:
return;
}
}
void Controller::onMouseWheelScrolled(
const sf::Event::MouseWheelScrollEvent &event) {
if (event.delta > 0) {
m_view.zoomIn();
} else if (event.delta < 0) {
m_view.zoomOut();
}
}
void Controller ::onMouseLeftButtonPressedOnBarMenu() {
auto highlightedButton{m_view.buttonUnderMouse()};
switch (highlightedButton) {
case View::Button::Quit:
m_view.closeWindow();
return;
case View::Button::Restart:
m_model.restart();
return;
case View::Button::Size:
if (m_model.status() == Model::Status::Ready) {
m_model.cycleSize();
}
return;
default:
return;
}
}
void Controller ::onMouseLeftButtonPressedOnCell() {
auto pos{m_view.cellUnderMouse()};
if (m_model.status() == Model::Status::Finished) {
return;
}
m_model.reveal(pos->first, pos->second);
return;
}
void Controller::onMouseRightButtonPressedOnCell() {
if (m_model.status() == Model::Status::Finished) {
return;
}
auto pos{m_view.cellUnderMouse()};
m_model.cycleCellStatus(pos->first, pos->second);
}
void Controller::onMouseBothButtonsPressedOnCell() {
if (m_model.status() == Model::Status::Finished) {
return;
}
auto pos{m_view.cellUnderMouse()};
m_model.tryRevealNeighbours(pos->first, pos->second);
}
void Controller::onMouseButtonPressed(
const sf::Event::MouseButtonEvent &event) {
auto cellIsHighlighted{m_view.cellUnderMouse().has_value()};
auto bothButtonsPressed{sf::Mouse::isButtonPressed(sf::Mouse::Left) &&
sf::Mouse::isButtonPressed(sf::Mouse::Right)};
if (cellIsHighlighted && bothButtonsPressed) {
return onMouseBothButtonsPressedOnCell();
}
auto buttonIsHighlighted{m_view.buttonUnderMouse() != View::Button::None};
switch (event.button) {
case sf::Mouse::Button::Left:
if (buttonIsHighlighted) {
return onMouseLeftButtonPressedOnBarMenu();
} else if (cellIsHighlighted) {
return onMouseLeftButtonPressedOnCell();
}
return;
case sf::Mouse::Button::Right:
if (cellIsHighlighted) {
return onMouseRightButtonPressedOnCell();
}
default:
return;
}
}
void Controller::onKeyPressed(const sf::Event::KeyEvent &event) {
switch (event.code) {
case sf::Keyboard::Escape:
m_view.closeWindow();
return;
default:
return;
}
}