|
1 | 1 | #include "basic_display.hpp" |
2 | 2 |
|
3 | | -#include "coordinates.hpp" |
4 | | -#include "ends.hpp" |
5 | | - |
6 | 3 | #include <fmt/format.h> |
7 | 4 |
|
8 | 5 | #include <cmath> |
9 | 6 |
|
10 | 7 | namespace fractal { |
11 | 8 |
|
12 | | -void BasicDisplay::display_window() |
| 9 | +void BasicDisplay::handle_event_(const sf::Event& event) |
13 | 10 | { |
14 | | - bool left_mouse_down{}; |
15 | | - float selection_start_x{}; |
16 | | - float selection_start_y{}; |
17 | | - float mouse_x{}; |
18 | | - float mouse_y{}; |
19 | | - |
20 | | - while (window_.isOpen()) { |
21 | | - sf::Event event{}; |
22 | | - while (window_.pollEvent(event)) { |
23 | | - switch (event.type) { |
24 | | - case sf::Event::Closed: |
25 | | - window_.close(); |
26 | | - break; |
27 | | - case sf::Event::MouseMoved: |
28 | | - mouse_x = static_cast<float>(event.mouseMove.x); |
29 | | - mouse_y = static_cast<float>(event.mouseMove.y); |
30 | | - break; |
31 | | - |
32 | | - case sf::Event::MouseButtonPressed: |
33 | | - if (event.mouseButton.button != sf::Mouse::Left) { |
34 | | - break; |
35 | | - } |
36 | | - left_mouse_down = true; |
37 | | - selection_start_x = static_cast<float>(event.mouseButton.x); |
38 | | - selection_start_y = static_cast<float>(event.mouseButton.y); |
39 | | - std::for_each( |
40 | | - observers_.begin(), observers_.end(), |
41 | | - [&](const auto& observer) { |
42 | | - observer->on_mouse_button_pressed(event.mouseButton); |
43 | | - } |
44 | | - ); |
45 | | - break; |
46 | | - default: |
47 | | - break; |
48 | | - |
49 | | - case sf::Event::MouseButtonReleased: |
50 | | - if (event.mouseButton.button != sf::Mouse::Left) { |
51 | | - break; |
52 | | - } |
53 | | - std::for_each( |
54 | | - observers_.begin(), observers_.end(), |
55 | | - [&](const auto& observer) { |
56 | | - observer->on_mouse_button_released(event.mouseButton); |
57 | | - } |
58 | | - ); |
59 | | - left_mouse_down = false; |
60 | | - break; |
| 11 | + switch (event.type) { |
| 12 | + case sf::Event::MouseMoved: |
| 13 | + for (const auto& observer : observers_) { |
| 14 | + observer->on_mouse_moved(event.mouseMove); |
61 | 15 | } |
62 | | - } |
| 16 | + return; |
| 17 | + case sf::Event::MouseButtonPressed: |
| 18 | + std::for_each( |
| 19 | + observers_.begin(), observers_.end(), |
| 20 | + [&](const auto& observer) { |
| 21 | + observer->on_mouse_button_pressed(event.mouseButton); |
| 22 | + } |
| 23 | + ); |
| 24 | + return; |
| 25 | + case sf::Event::MouseButtonReleased: |
| 26 | + std::for_each( |
| 27 | + observers_.begin(), observers_.end(), |
| 28 | + [&](const auto& observer) { |
| 29 | + observer->on_mouse_button_released(event.mouseButton); |
| 30 | + } |
| 31 | + ); |
| 32 | + return; |
| 33 | + default: |
| 34 | + break; |
| 35 | + } |
| 36 | +} |
63 | 37 |
|
64 | | - window_.clear(sf::Color::Black); |
| 38 | +void BasicDisplay::add_observer(std::unique_ptr<DisplayEventObserver> observer) |
| 39 | +{ |
| 40 | + observers_.push_back(std::move(observer)); |
| 41 | +} |
65 | 42 |
|
66 | | - for (const auto& observer : observers_) { |
67 | | - auto opt = observer->get_drawable(); |
68 | | - if (opt) { |
69 | | - window_.draw(opt.value()); |
70 | | - } |
71 | | - } |
| 43 | +void BasicDisplay::poll_window_events() |
| 44 | +{ |
| 45 | + sf::Event event{}; |
| 46 | + while (window_.pollEvent(event)) { |
| 47 | + handle_event_(event); |
| 48 | + } |
| 49 | +} |
72 | 50 |
|
73 | | - if (left_mouse_down) { |
74 | | - display_coordinate end_point = calculate_end_points( |
75 | | - {selection_start_x, selection_start_y}, {mouse_x, mouse_y} |
76 | | - ); |
| 51 | +void BasicDisplay::display_window() |
| 52 | +{ |
| 53 | + window_.clear(sf::Color::Black); |
77 | 54 |
|
78 | | - sf::RectangleShape selection_rectangle( |
79 | | - {end_point.first - selection_start_x, |
80 | | - end_point.second - selection_start_y} |
81 | | - ); |
82 | | - selection_rectangle.setPosition(selection_start_x, selection_start_y); |
83 | | - selection_rectangle.setFillColor(sf::Color(255, 0, 0, 127)); |
84 | | - window_.draw(selection_rectangle); |
| 55 | + auto draw_from_observer = [this](const auto& observer) { |
| 56 | + if (auto opt = observer->get_drawable(); opt) { |
| 57 | + window_.draw(*(opt.value())); |
85 | 58 | } |
| 59 | + }; |
86 | 60 |
|
87 | | - window_.display(); |
88 | | - } |
| 61 | + std::for_each(observers_.begin(), observers_.end(), draw_from_observer); |
| 62 | + |
| 63 | + window_.display(); |
89 | 64 | } |
90 | 65 | } // namespace fractal |
0 commit comments