/** * Copyright (c) 2022 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "textbox.h" char *TEXTBOX_TEXT; uint8_t TEXTBOX_TEXT_LENGTH; uint8_t TEXTBOX_STATE; uint8_t TEXTBOX_SCROLL; uint8_t TEXTBOX_TILES[TEXTBOX_TILES_MAX]; void textboxInit() { uint8_t i; // Reset textbox state TEXTBOX_TEXT = NULL; TEXTBOX_STATE = 0; TEXTBOX_TEXT_LENGTH = 0; TEXTBOX_SCROLL = 0; // Setup window data move_win(7, SCREENHEIGHT - (TEXTBOX_HEIGHT_IN_TILES * 8)); set_win_data(FONT_DATA_POSITION, FONT_TILE_COUNT, FONT_DATA); set_win_data(FRAME_DATA_POSITION, FRAME_TILE_COUNT, FRAME_DATA); // Corners TEXTBOX_TILES[0] = FRAME_TILE_TOP_LEFT; TEXTBOX_TILES[TEXTBOX_WIDTH_IN_TILES-1] = FRAME_TILE_TOP_RIGHT; TEXTBOX_TILES[TEXTBOX_TILES_MAX-1] = FRAME_TILE_BOTTOM_RIGHT; TEXTBOX_TILES[TEXTBOX_TILES_MAX-TEXTBOX_WIDTH_IN_TILES] = FRAME_TILE_BOTTOM_LEFT; // Edges for(i = 1; i < TEXTBOX_WIDTH_IN_TILES - 1; i++) { TEXTBOX_TILES[i] = FRAME_TILE_TOP_CENTER; TEXTBOX_TILES[TEXTBOX_TILES_MAX - 1 - i] = FRAME_TILE_BOTTOM_CENTER; } for(i = 1; i < TEXTBOX_HEIGHT_IN_TILES - 1; i++) { TEXTBOX_TILES[TEXTBOX_WIDTH_IN_TILES * i] = FRAME_TILE_CENTER_LEFT; TEXTBOX_TILES[TEXTBOX_WIDTH_IN_TILES * (i+1) - 1] = FRAME_TILE_CENTER_RIGHT; } } void textboxSetText(char *text, uint8_t length) { uint8_t i, j; // Reset textbox state TEXTBOX_TEXT = text; TEXTBOX_TEXT_LENGTH = length; TEXTBOX_STATE = TEXTBOX_STATE_VISIBLE; // Fill blank characters for(j = 0; j < TEXTBOX_CHAR_ROWS; j++) { for(i = 0; i < TEXTBOX_CHARS_PER_ROW ; i++) { TEXTBOX_TILES[(i+1) + ((j + 1) * TEXTBOX_WIDTH_IN_TILES)] = ( TEXTBOX_TILE_BLANK ); } } set_win_tiles( 0, 0, TEXTBOX_WIDTH_IN_TILES, TEXTBOX_HEIGHT_IN_TILES, TEXTBOX_TILES ); SHOW_WIN; } void textboxClose() { TEXTBOX_STATE &= ~TEXTBOX_STATE_VISIBLE; HIDE_WIN; } void textboxUpdate() { uint8_t i, j; if(!(TEXTBOX_STATE & TEXTBOX_STATE_VISIBLE)) return; if(TEXTBOX_STATE & TEXTBOX_STATE_SCROLLED) { return; } TEXTBOX_SCROLL++; j = TEXTBOX_WIDTH_IN_TILES + 1; for(i = 0; i < TEXTBOX_SCROLL; i++) { if(TEXTBOX_TEXT[i] == ' ') { j++; continue; } if(TEXTBOX_TEXT[i] == '\n') { j = ( (j / TEXTBOX_WIDTH_IN_TILES)*TEXTBOX_WIDTH_IN_TILES ) + TEXTBOX_WIDTH_IN_TILES + 1; continue; } TEXTBOX_TILES[j] = TEXTBOX_TEXT[i]; j++; } set_win_tiles( 0, 0, TEXTBOX_WIDTH_IN_TILES, TEXTBOX_HEIGHT_IN_TILES, TEXTBOX_TILES ); if(TEXTBOX_SCROLL == TEXTBOX_TEXT_LENGTH) { TEXTBOX_STATE |= TEXTBOX_STATE_SCROLLED; } }