Implement loading an image when file is dropped
This commit is contained in:
parent
9415786adc
commit
2fd02aea45
@ -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,
|
||||||
|
@ -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};
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user