make devices movable

This commit is contained in:
Robert 2023-06-30 20:36:21 +02:00
parent 7465b18ae8
commit c169fab420
5 changed files with 50 additions and 1 deletions

View file

@ -13,8 +13,11 @@ public:
void Render(SDL_Renderer* renderer) const; void Render(SDL_Renderer* renderer) const;
void Deselect(); void Deselect();
bool PropagateEvent(SDL_Event* event);
private: private:
SDL_FRect bbox; SDL_FRect bbox;
bool selected; bool selected;
bool grabbed;
std::shared_ptr<Device> device; std::shared_ptr<Device> device;
}; };

View file

@ -11,6 +11,8 @@ public:
void AddDevice(std::shared_ptr<Device> device, uint16_t x, uint16_t y); void AddDevice(std::shared_ptr<Device> device, uint16_t x, uint16_t y);
void Render(SDL_Renderer* renderer) const; void Render(SDL_Renderer* renderer) const;
void PropagateEvent(SDL_Event* event);
private: private:
Network& network; Network& network;
std::vector<DeviceRenderer> devices; std::vector<DeviceRenderer> devices;

View file

@ -3,7 +3,7 @@
#include <SDL.h> #include <SDL.h>
DeviceRenderer::DeviceRenderer(std::shared_ptr<Device> device, uint16_t x, uint16_t y) : DeviceRenderer::DeviceRenderer(std::shared_ptr<Device> device, uint16_t x, uint16_t y) :
device(device), selected(false) device(device), selected(false), grabbed(false)
{ {
bbox.x = x; bbox.x = x;
bbox.y = y; bbox.y = y;
@ -15,6 +15,35 @@ void DeviceRenderer::Deselect() {
selected = false; selected = false;
} }
bool DeviceRenderer::PropagateEvent(SDL_Event* event) {
if (event->type == SDL_EVENT_MOUSE_BUTTON_UP) {
if (event->button.button == SDL_BUTTON_LEFT) {
grabbed = false;
}
}
else if (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
float x, y;
SDL_GetMouseState(&x, &y);
if (x >= bbox.x && x <= bbox.x + bbox.w && y >= bbox.y && y <= bbox.y + bbox.h) {
selected = true;
grabbed = true;
return true;
}
} else if (grabbed && event->type == SDL_EVENT_MOUSE_MOTION) {
float x, y;
SDL_GetMouseState(&x, &y);
bbox.x += event->motion.xrel;
bbox.y += event->motion.yrel;
return true;
}
return false;
}
void DeviceRenderer::Render(SDL_Renderer* renderer) const { void DeviceRenderer::Render(SDL_Renderer* renderer) const {
SDL_SetRenderDrawColor(renderer, 150, 150, 150, 255); SDL_SetRenderDrawColor(renderer, 150, 150, 150, 255);
SDL_RenderFillRect(renderer, &bbox); SDL_RenderFillRect(renderer, &bbox);

View file

@ -12,6 +12,20 @@ void NetworkRenderer::AddDevice(std::shared_ptr<Device> device, uint16_t x, uint
devices.push_back(DeviceRenderer(device, x, y)); devices.push_back(DeviceRenderer(device, x, y));
} }
void NetworkRenderer::PropagateEvent(SDL_Event* event) {
if (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
for (DeviceRenderer& device : devices) {
device.Deselect();
}
}
for (auto it = devices.rbegin(); it != devices.rend(); it++) {
if (it->PropagateEvent(event)) {
break;
}
}
}
void NetworkRenderer::Render(SDL_Renderer* renderer) const { void NetworkRenderer::Render(SDL_Renderer* renderer) const {
for (const DeviceRenderer& device : devices) { for (const DeviceRenderer& device : devices) {
device.Render(renderer); device.Render(renderer);

View file

@ -36,6 +36,7 @@ int main(int argc, char** argv) {
while (!shouldClose) { while (!shouldClose) {
while (SDL_PollEvent(&event)) { while (SDL_PollEvent(&event)) {
ImGui_ImplSDL3_ProcessEvent(&event); ImGui_ImplSDL3_ProcessEvent(&event);
networkRenderer.PropagateEvent(&event);
switch (event.type) { switch (event.type) {
case SDL_EVENT_WINDOW_CLOSE_REQUESTED: case SDL_EVENT_WINDOW_CLOSE_REQUESTED: