mirror of
https://github.com/cavv-dev/Kekatsu-DS.git
synced 2025-06-18 16:55:40 -04:00
157 lines
4.3 KiB
C
157 lines
4.3 KiB
C
#include "keyboard.h"
|
|
|
|
#include "backspaceKey.h"
|
|
#include "shiftKey.h"
|
|
#include <stdlib.h>
|
|
|
|
struct GuiKeyboard {
|
|
size_t posX;
|
|
size_t posY;
|
|
struct GuiKeyboardKey* keys;
|
|
bool shiftPressed;
|
|
};
|
|
|
|
#define KEYS_COUNT 43
|
|
|
|
void setKeys(GuiKeyboard gk)
|
|
{
|
|
const char* chars;
|
|
|
|
if (!gk->shiftPressed)
|
|
chars = "1234567890\0qwertyuiop@asdfghjkl\0zxcvbnm-. \0";
|
|
else
|
|
chars = "1234567890\0QWERTYUIOP+ASDFGHJKL\0ZXCVBNM_/ \0";
|
|
|
|
for (size_t i = 0; i < KEYS_COUNT; i++) {
|
|
gk->keys[i].c = chars[i];
|
|
gk->keys[i].extraKey = GUI_KEYBOARD_EXTRA_KEY_NONE;
|
|
|
|
char text[2] = { chars[i], '\0' };
|
|
setGuiTextText(gk->keys[i].label, text);
|
|
}
|
|
|
|
gk->keys[10].extraKey = GUI_KEYBOARD_EXTRA_KEY_BACKSPACE;
|
|
gk->keys[31].extraKey = GUI_KEYBOARD_EXTRA_KEY_SHIFT;
|
|
}
|
|
|
|
void setKeysPos(GuiKeyboard gk)
|
|
{
|
|
// First row
|
|
for (size_t i = 0; i < 11; i++)
|
|
setGuiButtonPos(gk->keys[i].btn, gk->posX + i * 23, gk->posY);
|
|
|
|
// Second row
|
|
for (size_t i = 11; i < 22; i++)
|
|
setGuiButtonPos(gk->keys[i].btn, gk->posX + (i - 11) * 23 + 1, gk->posY + 23);
|
|
|
|
// Third row
|
|
for (size_t i = 22; i < 32; i++)
|
|
setGuiButtonPos(gk->keys[i].btn, gk->posX + (i - 22) * 23 + 11, gk->posY + 23 * 2);
|
|
|
|
// Fourth row
|
|
for (size_t i = 32; i < 41; i++)
|
|
setGuiButtonPos(gk->keys[i].btn, gk->posX + (i - 32) * 23 + 22, gk->posY + 23 * 3);
|
|
|
|
// Space
|
|
setGuiButtonPos(gk->keys[41].btn, gk->posX + 70, gk->posY + 23 * 4);
|
|
}
|
|
|
|
void setKeysShift(GuiKeyboard gk)
|
|
{
|
|
gk->shiftPressed = (gk->shiftPressed ? false : true);
|
|
setKeys(gk);
|
|
}
|
|
|
|
GuiKeyboard newGuiKeyboard(u16 textColor, u16 hoverColor)
|
|
{
|
|
GuiKeyboard gk = malloc(sizeof(struct GuiKeyboard));
|
|
gk->posX = 0;
|
|
gk->posY = 0;
|
|
gk->keys = malloc(sizeof(struct GuiKeyboardKey) * KEYS_COUNT);
|
|
gk->shiftPressed = false;
|
|
|
|
// All keys
|
|
for (size_t i = 0; i < KEYS_COUNT; i++) {
|
|
gk->keys[i].bg = newGuiBox(23, 23, 0);
|
|
|
|
gk->keys[i].bgHover = newGuiBox(23, 23, 0);
|
|
setGuiBoxBorder(gk->keys[i].bgHover, 1, hoverColor);
|
|
|
|
gk->keys[i].label = newGuiText("", GUI_TEXT_SIZE_MEDIUM, textColor);
|
|
setGuiTextAlignment(gk->keys[i].label, GUI_TEXT_H_ALIGN_CENTER, GUI_TEXT_V_ALIGN_MIDDLE);
|
|
|
|
gk->keys[i].btn = newGuiButton(23, 23);
|
|
setGuiButtonBg(gk->keys[i].btn, gk->keys[i].bg, gk->keys[i].bgHover);
|
|
setGuiButtonLabel(gk->keys[i].btn, gk->keys[i].label);
|
|
}
|
|
|
|
// Space
|
|
setGuiBoxWidth(gk->keys[41].bg, 115);
|
|
setGuiBoxBorder(gk->keys[41].bg, 1, textColor);
|
|
setGuiBoxWidth(gk->keys[41].bgHover, 115);
|
|
setGuiButtonWidth(gk->keys[41].btn, 115);
|
|
|
|
// Backspace
|
|
gk->keys[10].icon = newGuiImage(backspaceKeyBitmap, backspaceKeyPal, 15, 11, 16, 16, 0, 0, GUI_IMAGE_TEXTURE_TYPE_RGB256);
|
|
setGuiImageColorTint(gk->keys[10].icon, textColor);
|
|
setGuiButtonIcon(gk->keys[10].btn, gk->keys[10].icon, gk->keys[10].icon);
|
|
|
|
// Shift
|
|
gk->keys[31].icon = newGuiImage(shiftKeyBitmap, shiftKeyPal, 11, 13, 16, 16, 0, 0, GUI_IMAGE_TEXTURE_TYPE_RGB256);
|
|
setGuiImageColorTint(gk->keys[31].icon, textColor);
|
|
setGuiButtonIcon(gk->keys[31].btn, gk->keys[31].icon, gk->keys[31].icon);
|
|
|
|
setKeysPos(gk);
|
|
|
|
setKeys(gk);
|
|
|
|
return gk;
|
|
}
|
|
|
|
void freeGuiKeyboard(GuiKeyboard gk)
|
|
{
|
|
for (size_t i = 0; i < KEYS_COUNT; i++) {
|
|
freeGuiBox(gk->keys[i].bg);
|
|
freeGuiBox(gk->keys[i].bgHover);
|
|
freeGuiText(gk->keys[i].label);
|
|
freeGuiButton(gk->keys[i].btn);
|
|
}
|
|
|
|
freeGuiImage(gk->keys[10].icon); // Backspace
|
|
freeGuiImage(gk->keys[31].icon); // Shift
|
|
|
|
free(gk->keys);
|
|
free(gk);
|
|
}
|
|
|
|
void setGuiKeyboardPos(GuiKeyboard gk, size_t posX, size_t posY)
|
|
{
|
|
gk->posX = posX;
|
|
gk->posY = posY;
|
|
setKeysPos(gk);
|
|
}
|
|
|
|
struct GuiKeyboardKey getGuiKeyboardPressed(GuiKeyboard gk)
|
|
{
|
|
for (size_t i = 0; i < KEYS_COUNT; i++) {
|
|
if (getGuiButtonState(gk->keys[i].btn) != GUI_BUTTON_STATE_CLICKED)
|
|
continue;
|
|
|
|
if (i == 31) // Shift
|
|
setKeysShift(gk);
|
|
|
|
resetGuiButtonState(gk->keys[i].btn);
|
|
return gk->keys[i];
|
|
}
|
|
|
|
return gk->keys[KEYS_COUNT - 1]; // None key
|
|
}
|
|
|
|
void drawGuiKeyboard(GuiKeyboard gk)
|
|
{
|
|
for (size_t i = 0; i < KEYS_COUNT; i++) {
|
|
handleTouchGuiButton(gk->keys[i].btn);
|
|
drawGuiButton(gk->keys[i].btn);
|
|
}
|
|
}
|