/* * Copyright Luka Jankovic 2025 * * This file is part of Kubo. * * Kubo is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * Kubo is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * Kubo. If not, see . */ #include "kubo_state_wall_select.h" #include "../kubo_context.h" static inline void wall_select_refresh(struct kubo_context *context); static void select_next_wall(struct kubo_context *context); static void select_prev_wall(struct kubo_context *context); static void delete_wall(struct kubo_context *context); void kubo_state_wall_select_entered(void *context_data) { struct kubo_context *context = (struct kubo_context *)context_data; wall_select_refresh(context); } void kubo_state_wall_select_key(void *context_data, int key_code) { struct kubo_context *context = (struct kubo_context *)context_data; switch (key_code) { case KEY_RIGHT: case KEY_L: case KEY_UP: case KEY_K: select_next_wall(context); break; case KEY_LEFT: case KEY_H: case KEY_DOWN: case KEY_J: select_prev_wall(context); break; case KEY_X: delete_wall(context); default: break; } } static void select_next_wall(struct kubo_context *context) { if (!context->walls.count) { return; } context->wall_select_index = (context->wall_select_index + 1) % context->walls.count; wall_select_refresh(context); } static void select_prev_wall(struct kubo_context *context) { if (context->state.id != KUBO_CONTEXT_WALL_SELECT || !context->walls.count) { return; } size_t count = context->walls.count; context->wall_select_index = (context->wall_select_index + count - 1) % count; wall_select_refresh(context); } static inline void wall_select_refresh(struct kubo_context *context) { for (size_t i = 0; i < context->walls.count; i++) { struct kubo_wall *wall = kubo_wall_arr_get(&context->walls, i); wall->state = i == context->wall_select_index ? KUBO_WALL_SELECTED : KUBO_WALL_DONE; } } static void delete_wall(struct kubo_context *context) { kubo_wall_arr_del(&context->walls, context->wall_select_index); select_next_wall(context); }