From 8a4d894e336752e37fa84fc55885a70e65db8c4a Mon Sep 17 00:00:00 2001 From: Adam NAILI Date: Tue, 2 Jan 2018 00:28:20 +0100 Subject: Implementing GUI (init, handling_event, free) --- src/gui/gui.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 139 insertions(+), 3 deletions(-) (limited to 'src/gui/gui.c') diff --git a/src/gui/gui.c b/src/gui/gui.c index 2a3d018..3982f68 100644 --- a/src/gui/gui.c +++ b/src/gui/gui.c @@ -1,4 +1,140 @@ -// -// Created by adam on 01/01/18. -// +#include +#include +#include +#include +#include + +GUI *gui_init(const char *fpath1, const char *fpath2) { + GUI *gui = malloc_or_die(sizeof(GUI)); + + gui->window = malloc_or_die(sizeof(Window)); + window_init(gui->window, 500, 500, "Morphing"); + window_create(gui->window); + gui->canvasSrc = canvas_create_from_image(fpath1); + gui->canvasTrg = canvas_create_from_image(fpath2); + if (gui->canvasSrc->mlv == NULL || gui->canvasTrg->mlv == NULL) { + canvas_destroy(gui->canvasSrc); + canvas_destroy(gui->canvasTrg); + /*window_free(gui->window);*/ + fprintf(stderr, "Impossible to create an image from the path given. Verify the two paths.\n"); + exit(-4); + } + int canvasSrcWidth; + int canvasTrgWidth; + int canvasSrcHeight; + int canvasTrgHeight; + + MLV_get_image_size(gui->canvasSrc->mlv, &canvasSrcWidth, &canvasSrcHeight); + MLV_get_image_size(gui->canvasTrg->mlv, &canvasTrgWidth, &canvasTrgHeight); + + if (canvasSrcWidth != canvasTrgWidth || canvasSrcHeight != canvasTrgHeight) { + canvas_destroy(gui->canvasSrc); + canvas_destroy(gui->canvasTrg); + window_free(gui->window); + fprintf(stderr, "The two pictures do not have the same size\n"); + exit(-5); + } + + gui->window->width = 2 * canvasSrcWidth + 10; + gui->window->height = canvasSrcHeight + 200; + + MLV_change_window_size((unsigned int) gui->window->width, (unsigned int) gui->window->height); + + gui->button1 = malloc_or_die(sizeof(Button)); + gui->button2 = malloc_or_die(sizeof(Button)); + gui->button3 = malloc_or_die(sizeof(Button)); + gui->button4 = malloc_or_die(sizeof(Button)); + gui->button5 = malloc_or_die(sizeof(Button)); + gui->button6 = malloc_or_die(sizeof(Button)); + gui->button7 = malloc_or_die(sizeof(Button)); + + gui->pictureFrame1 = malloc_or_die(sizeof(PictureFrame)); + gui->pictureFrame2 = malloc_or_die(sizeof(PictureFrame)); + + gui->morphing = morphing_create(canvasSrcWidth, canvasSrcHeight); + + + sprintf(labelFrame, "%03d frames", frame); + button_init(gui->button1, "Add constraint point", 10, 0, 0, button_click_add_constraint); + button_init(gui->button2, "Show/Hide", 10, 0, 0, button_click_show_hide); + button_init(gui->button3, "Start rendering", 10, 0, 0, button_click_rendering); + button_init(gui->button4, "<<<", 10, 0, 0, button_click_less_frame); + button_init(gui->button5, labelFrame, 10, 0, 0, button_click_none); + button_init(gui->button6, ">>>", 10, 0, 0, button_click_more_frame); + button_init(gui->button7, "Exit", 10, 0, 0, button_click_exit); + + pictureframe_init(gui->pictureFrame1, canvasSrcWidth, canvasSrcHeight, 0, 0, pictureframe_origin_split, gui->morphing, + gui->canvasSrc, + pictureframe_click_handler_origin); + pictureframe_init(gui->pictureFrame2, canvasSrcWidth, canvasSrcHeight, 0, 0, pictureframe_target_split, gui->morphing, + gui->canvasTrg, + pictureframe_click_handler_target); + + window_add_pictureframe(gui->window, gui->pictureFrame1); + window_add_pictureframe(gui->window, gui->pictureFrame2); + + window_add_button(gui->window, gui->button1); + window_add_button(gui->window, gui->button2); + window_add_button(gui->window, gui->button3); + window_add_button(gui->window, gui->button4); + window_add_button(gui->window, gui->button5); + window_add_button(gui->window, gui->button6); + window_add_button(gui->window, gui->button7); + + + window_print_buttons(gui->window); + window_print_pictureframes(gui->window); + return gui; +} + +void gui_handle_event(GUI *gui) { + window_click_keyboard_handler(gui->window, &gui->keyboardButton, &gui->keyboardModifier, &gui->unicode, &gui->mouse_x, + &gui->mouse_y); + switch (mode) { + case PRINTING: + window_print_pictureframes(gui->window); + mode = WAITING_BUTTON_SHOW; + break; + case WAITING_BUTTON_SHOW: + window_print_pictureframes(gui->window); + break; + case WAITING_BUTTON_HIDE: + window_print_pictureframes(gui->window); + break; + case PRINTING_BUTTONS: + button_init(gui->button5, labelFrame, 10, gui->button5->component.x_pos, gui->button5->component.y_pos, + button_click_none); + window_print_buttons(gui->window); + mode = WAITING_BUTTON_SHOW; + break; + case RENDERING: + window_rendering(gui->window, gui->pictureFrame1, gui->canvasSrc, gui->canvasTrg, gui->morphing); + break; + case INSERT_TARGET: + if (gui->keyboardButton == MLV_KEYBOARD_ESCAPE) { + window_print_pictureframes(gui->window); + mode = WAITING_BUTTON_SHOW; + } + break; + default: + break; + } +} + +void gui_free(GUI *gui) { + window_free(gui->window); + canvas_destroy(gui->canvasSrc); + canvas_destroy(gui->canvasTrg); + morphing_destroy(gui->morphing); + + free(gui->button1); + free(gui->button2); + free(gui->button3); + free(gui->button4); + free(gui->button5); + free(gui->button6); + free(gui->button7); + free(gui->pictureFrame1); + free(gui->pictureFrame2); +} \ No newline at end of file -- cgit v1.2.3