From d73d9625618f04223de8ea0ed999e3389cdb7ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Thu, 17 Jun 2021 16:04:52 +0200 Subject: [PATCH] feat: add mode change to scroll through picture --- image-viewer/include/image_viewer.h | 14 ++++++- image-viewer/src/image_viewer.c | 64 ++++++++++++++++++++++++++--- 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/image-viewer/include/image_viewer.h b/image-viewer/include/image_viewer.h index 512f6487627c20d6fce00e118a00184ad7d08a48..6f757c9338d1fb4b68f78562b52749bf28b7a26b 100644 --- a/image-viewer/include/image_viewer.h +++ b/image-viewer/include/image_viewer.h @@ -7,18 +7,28 @@ #include "cursor.h" #include "logger.h" +typedef enum { + MOD_CURSOR, + MOD_IMAGE, + MOD_COUNT, +} image_viewer_mode_t; + typedef struct { - image_t image; cursor_t cursor; + + image_t image; + image_zoom_t scale; image_region_t image_region; image_region_t display_region; - image_error_t error; + + image_viewer_mode_t mode; display_t *display; bool running; logger_t *logger; + image_error_t error; } image_viewer_t; image_viewer_t image_viewer_create(char *filename, display_t *display, logger_t *logger); diff --git a/image-viewer/src/image_viewer.c b/image-viewer/src/image_viewer.c index 55316cf5df6afc2e9748697dae8476fa9ecfc1ab..64fe6d0fb1410c97b4498a0ca634a1534264038c 100644 --- a/image-viewer/src/image_viewer.c +++ b/image-viewer/src/image_viewer.c @@ -46,16 +46,47 @@ void command_handler_move_cursor(void *data, direction_t direction, int amount) image_viewer_t *viewer = (image_viewer_t *)data; cursor_hide(&viewer->cursor, &viewer->image, viewer->scale, viewer->display); - if (!cursor_move(&viewer->cursor, - image_get_zoom_region(&viewer->image, viewer->scale), - direction, amount / viewer->scale.scale)) { - direction_move_xy(direction, (int32_t*)&viewer->scale.x, (int32_t*)&viewer->scale.y, amount / viewer->scale.scale); + int32_t x = viewer->scale.x, y = viewer->scale.y; + bool move_cursor = false; + switch (viewer->mode) { + case MOD_CURSOR: + if (!cursor_move(&viewer->cursor, + image_get_zoom_region(&viewer->image, viewer->scale), + direction, amount / viewer->scale.scale)) { + direction_move_xy(direction, &x, + &y, + amount / viewer->scale.scale); + move_cursor = true; + } + break; + case MOD_IMAGE: + logger_debug(viewer->logger, __FILE__, __FUNCTION__, __LINE__, "Moving image"); + direction_move_xy(direction, &x, + &y, + amount / viewer->scale.scale); + move_cursor = true; + break; + default: + break; + } + + if (x < 0) { + x = 0; + } + if (y < 0) { + y = 0; + } + + viewer->scale.x = x; + viewer->scale.y = y; + + if (move_cursor) { cursor_move(&viewer->cursor, image_get_zoom_region(&viewer->image, viewer->scale), direction, amount / viewer->scale.scale); - image_viewer_display_image(viewer); } + image_viewer_display_image(viewer); cursor_show(&viewer->cursor, &viewer->image, viewer->scale, viewer->display); display_render(viewer->display); } @@ -186,6 +217,24 @@ void command_handler_zoom_reset(void *data, int amount) { cursor_show(&viewer->cursor, &viewer->image, viewer->scale, viewer->display); } +void command_handler_change_mode(void *data, int amount) { + if (!amount) { + return; + } + + image_viewer_t *viewer = (image_viewer_t *)data; + logger_debug(viewer->logger, __FILE__, __FUNCTION__, __LINE__, + "Changing mode"); + + uint8_t mode = viewer->mode; + mode++; + if (mode >= MOD_COUNT) { + mode %= MOD_COUNT; + } + + viewer->mode = mode; +} + void image_viewer_register_commands(image_viewer_t *viewer, commands_t *commands) { commands_register(commands, IN_KEYBOARD, 'h', &command_handler_move_left, viewer); @@ -205,6 +254,8 @@ void image_viewer_register_commands(image_viewer_t *viewer, commands_t *commands viewer); commands_register(commands, IN_KEYBOARD, 'r', &command_handler_zoom_reset, viewer); + commands_register(commands, IN_KEYBOARD, 'm', &command_handler_change_mode, + viewer); commands_register(commands, IN_ENCODER_ROTATE, 0, &command_handler_move_right, viewer); @@ -216,6 +267,9 @@ void image_viewer_register_commands(image_viewer_t *viewer, commands_t *commands commands_register(commands, IN_ENCODER_CLICK, 0, &command_handler_exit, viewer); + commands_register(commands, IN_ENCODER_CLICK, 1, &command_handler_change_mode, + viewer); + commands_register(commands, IN_ENCODER_CLICK, 2, &command_handler_zoom_reset, viewer); }