Implement loading an image when file is dropped

This commit is contained in:
Abdelrahman Said 2024-01-10 00:00:37 +00:00
parent 9415786adc
commit 2fd02aea45
2 changed files with 49 additions and 1 deletions

View File

@ -2,13 +2,17 @@
#define DROP_AREA_H #define DROP_AREA_H
#include "colour.h" #include "colour.h"
#include "image.h"
#include "window.h" #include "window.h"
#include <stdbool.h> #include <stdbool.h>
typedef struct { typedef struct {
render_rect_t rect; render_rect_t rect;
render_rect_t image_rect;
colour_t border_colour; colour_t border_colour;
image_t image;
bool mouseover; bool mouseover;
bool image_loaded;
} drop_area_t; } drop_area_t;
void init_drop_area(window_t *wnd, drop_area_t *area, render_rect_t rect, void init_drop_area(window_t *wnd, drop_area_t *area, render_rect_t rect,

View File

@ -1,18 +1,23 @@
#include "drop_area.h" #include "drop_area.h"
#include "SDL_events.h" #include "SDL_events.h"
#include "colour.h" #include "colour.h"
#include "image.h"
#include "window.h" #include "window.h"
#include <stdbool.h>
#include <stdio.h> #include <stdio.h>
void handle_hover(const window_t *wnd, void *obj, const SDL_Event *ev); void handle_hover(const window_t *wnd, void *obj, const SDL_Event *ev);
void handle_drop_file(const window_t *wnd, void *obj, const SDL_Event *ev); void handle_drop_file(const window_t *wnd, void *obj, const SDL_Event *ev);
void render_drop_area(const window_t *wnd, void *obj); void render_drop_area(const window_t *wnd, void *obj);
render_rect_t image_render_rect(drop_area_t *area);
void init_drop_area(window_t *wnd, drop_area_t *area, render_rect_t rect, void init_drop_area(window_t *wnd, drop_area_t *area, render_rect_t rect,
colour_t border_colour) { colour_t border_colour) {
area->rect = rect; area->rect = rect;
area->image_rect = (render_rect_t){0};
area->border_colour = border_colour; area->border_colour = border_colour;
area->mouseover = false; area->mouseover = false;
area->image_loaded = false;
add_event_listener(wnd, area, handle_hover); add_event_listener(wnd, area, handle_hover);
add_event_listener(wnd, area, handle_drop_file); add_event_listener(wnd, area, handle_drop_file);
@ -40,7 +45,14 @@ void handle_drop_file(const window_t *wnd, void *obj, const SDL_Event *ev) {
return; return;
} }
printf("%s\n", ev->drop.file); printf("Loading: %s\n", ev->drop.file);
area->image_loaded = load_image(wnd, &(area->image), ev->drop.file);
if (area->image_loaded) {
printf("Width: %ld, Height: %ld\n", area->image.width, area->image.height);
area->image_rect = image_render_rect(area);
}
} }
void render_drop_area(const window_t *wnd, void *obj) { void render_drop_area(const window_t *wnd, void *obj) {
@ -50,5 +62,37 @@ void render_drop_area(const window_t *wnd, void *obj) {
drop_area_t *area = (drop_area_t *)obj; drop_area_t *area = (drop_area_t *)obj;
if (area->image_loaded) {
render_texture(wnd, area->image.texture, NULL, &(area->image_rect));
}
draw_rect(wnd, &(area->rect), area->border_colour); draw_rect(wnd, &(area->rect), area->border_colour);
} }
render_rect_t image_render_rect(drop_area_t *area) {
if (!area || !(area->image_loaded)) {
return (render_rect_t){0};
}
u64 w = 0;
u64 h = 0;
if (area->image.width < area->rect.width &&
area->image.height < area->rect.height) {
w = area->image.width;
h = area->image.height;
} else {
f32 w_factor = (f32)area->rect.width / area->image.width;
f32 h_factor = (f32)area->rect.height / area->image.height;
f32 factor = w_factor < h_factor ? w_factor : h_factor;
w = area->image.width * factor;
h = area->image.height * factor;
}
u64 x = area->rect.x + (area->rect.width - w) / 2;
u64 y = area->rect.y + (area->rect.height - h) / 2;
return (render_rect_t){x, y, w, h};
}