113 lines
2.6 KiB
C
113 lines
2.6 KiB
C
/**
|
|
* 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;
|
|
}
|
|
} |