Skip to content

Commit 3045f70

Browse files
committed
add resizing to display
1 parent eaf431b commit 3045f70

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

source/graphics/basic_display.cpp

+59
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include "basic_display.hpp"
22

3+
#include <fmt/format.h>
34
#include <SFML/Graphics.hpp>
5+
#include <SFML/Graphics/RectangleShape.hpp>
46

57
namespace fractal {
68
void BasicDisplay::set_pixel(std::size_t x_pos, std::size_t y_pos, uint8_t value)
@@ -31,9 +33,53 @@ void BasicDisplay::display_window()
3133

3234
sf::Sprite sprite(texture);
3335

36+
bool left_mouse_down{};
37+
float selection_start_x{};
38+
float selection_start_y{};
39+
float mouse_x{};
40+
float mouse_y{};
41+
3442
while (window.isOpen()) {
3543
sf::Event event;
3644
while (window.pollEvent(event)) {
45+
switch (event.type) {
46+
case sf::Event::Closed:
47+
window.close();
48+
break;
49+
case sf::Event::MouseMoved:
50+
mouse_x = static_cast<float>(event.mouseMove.x);
51+
mouse_y = static_cast<float>(event.mouseMove.y);
52+
break;
53+
54+
case sf::Event::MouseButtonPressed:
55+
if (event.mouseButton.button != sf::Mouse::Left) {
56+
break;
57+
}
58+
left_mouse_down = true;
59+
selection_start_x = static_cast<float>(event.mouseButton.x);
60+
selection_start_y = static_cast<float>(event.mouseButton.y);
61+
break;
62+
63+
case sf::Event::MouseButtonReleased:
64+
if (event.mouseButton.button != sf::Mouse::Left) {
65+
break;
66+
}
67+
on_resize_(
68+
sf::Vector2f(
69+
std::min(mouse_x, selection_start_x),
70+
std::min(mouse_y, selection_start_y)
71+
),
72+
sf::Vector2f(
73+
std::max(mouse_x, selection_start_x),
74+
std::max(mouse_y, selection_start_y)
75+
)
76+
);
77+
left_mouse_down = false;
78+
break;
79+
80+
default:
81+
break;
82+
}
3783
if (event.type == sf::Event::Closed) {
3884
window.close();
3985
}
@@ -42,6 +88,19 @@ void BasicDisplay::display_window()
4288
window.clear(sf::Color::Black);
4389

4490
window.draw(sprite);
91+
if (left_mouse_down) {
92+
sf::RectangleShape selection_rectangle(sf::Vector2f(
93+
std::abs(mouse_x - selection_start_x),
94+
std::abs(mouse_y - selection_start_y)
95+
));
96+
selection_rectangle.setPosition(
97+
std::min(mouse_x, selection_start_x),
98+
std::min(mouse_y, selection_start_y)
99+
);
100+
101+
selection_rectangle.setFillColor(sf::Color(255, 0, 0, 127));
102+
window.draw(selection_rectangle);
103+
}
45104

46105
window.display();
47106
}

source/graphics/basic_display.hpp

+9
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,24 @@
22

33
#include "config.hpp"
44

5+
#include <SFML/System/Vector2.hpp>
6+
57
#include <cstdint>
68

79
#include <array>
10+
#include <functional>
11+
#include <utility>
812

913
namespace fractal {
1014
class BasicDisplay {
1115
std::array<std::array<uint8_t, WINDOW_HEIGHT>, WINDOW_WIDTH> pixels_{};
16+
std::function<void(sf::Vector2f, sf::Vector2f)> on_resize_;
1217

1318
public:
19+
explicit BasicDisplay(std::function<void(sf::Vector2f, sf::Vector2f)> on_resize) :
20+
on_resize_(std::move(on_resize))
21+
{}
22+
1423
void set_pixel(std::size_t x_pos, std::size_t y_pos, std::uint8_t value);
1524
void display_window();
1625
};

0 commit comments

Comments
 (0)