#include "text_viewer_handlers.h" #include "direction.h" #include "display_utils.h" #include "gui_component_text_view.h" #include "keyboard_const.h" #include "rotation_const.h" static void command_handler_move(void *state, direction_t direction, int amount) { component_t *text_view = (component_t *)state; if (text_view->focused) { int32_t x = 0; int32_t y = 0; direction_move_xy(direction, &x, &y, amount); gui_text_view_scroll(text_view, x, y); } } static void command_handler_jump(void *state, direction_t direction, int amount) { component_t *text_view = (component_t *)state; if (direction == LEFT || direction == RIGHT) { amount = DISPLAY_WIDTH * 0.6; } else { amount = DISPLAY_HEIGHT * 0.4; } int32_t x = 0; int32_t y = 0; direction_move_xy(direction, &x, &y, amount); gui_text_view_scroll(text_view, x, y); } static void command_handler_move_down(void *state, int amount) { command_handler_move(state, DOWN, amount); } static void command_handler_move_up(void *state, int amount) { command_handler_move(state, UP, amount); } static void command_handler_move_left(void *state, int amount) { command_handler_move(state, LEFT, amount); } static void command_handler_move_right(void *state, int amount) { command_handler_move(state, RIGHT, amount); } static void command_handler_jump_up(void *state, int amount) { command_handler_jump(state, UP, amount); } static void command_handler_jump_down(void *state, int amount) { command_handler_jump(state, DOWN, amount); } static void command_handler_jump_right(void *state, int amount) { command_handler_jump(state, RIGHT, amount); } static void command_handler_jump_left(void *state, int amount) { command_handler_jump(state, LEFT, amount); } static void command_handler_reset(void *state, int amount) { gui_text_view_reset_scroll((component_t *)state); } static void command_handler_full_scroll(void *state, int amount) { gui_text_view_full_scroll((component_t *)state); } static void command_handler_zoom_in(void *state, int amount) { component_t *component = (component_t *)state; multiline_text_t* text = (multiline_text_t*) (component)->state; uint16_t old_size = text->font->size; amount = amount > 1 ? 1 : -1; text->font->size += amount; if (text->font->size == 0) { text->font->size = 1; } component->y += amount * (component->y / (old_size + text->font->line_spacing)); } static void command_handler_zoom_out(void *state, int amount) { command_handler_zoom_in(state, -amount); } static void command_handler_zoom_reset(void *state, int amount) { component_t *component = (component_t *)state; multiline_text_t *text = (multiline_text_t *)(component)->state; uint16_t old_size = text->font->size; text->font->size = text->font->font.height; amount = text->font->size - old_size; component->y += amount * (component->y / (old_size + text->font->line_spacing)); } void gui_text_view_register_commands(gui_t *gui, component_t *text_view) { commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_LEFT, command_handler_move_left, text_view); commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_RIGHT, command_handler_move_right, text_view); commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_DOWN, command_handler_move_down, text_view); commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_UP, command_handler_move_up, text_view); commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_JUMP_LEFT, command_handler_jump_left, text_view); commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_JUMP_RIGHT, command_handler_jump_right, text_view); commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_PAGE_DOWN, command_handler_jump_down, text_view); commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_PAGE_UP, command_handler_jump_up, text_view); commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_HOME, command_handler_reset, text_view); commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_END, command_handler_full_scroll, text_view); commands_register(gui->commands, IN_KEYBOARD, 'c', command_handler_zoom_reset, text_view); commands_register(gui->commands, IN_ENCODER_ROTATE, ROTATION_ENCODER_HORIZONTAL, command_handler_move_right, text_view); commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_ZOOM_IN, command_handler_zoom_in, text_view); commands_register(gui->commands, IN_KEYBOARD, KEYBOARD_ZOOM_OUT, command_handler_zoom_out, text_view); commands_register(gui->commands, IN_ENCODER_ROTATE, ROTATION_ENCODER_ZOOM, command_handler_zoom_in, text_view); commands_register(gui->commands, IN_ENCODER_ROTATE, ROTATION_ENCODER_VERTICAL, command_handler_move_down, text_view); commands_register(gui->commands, IN_ENCODER_CLICK, ROTATION_ENCODER_VERTICAL, command_handler_reset, text_view); commands_register(gui->commands, IN_ENCODER_CLICK, ROTATION_ENCODER_ZOOM, command_handler_full_scroll, text_view); }