191 lines
5.4 KiB
C
Raw Permalink Normal View History

2021-08-10 15:00:09 +08:00
//<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD> GUI <20><>
#include "sys.h"
#include "key.h"
#include "lcd.h"
#include "GameEngine.h"
#include "GE_GUI.h"
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> GE_GUI
*/
void GE_GUI_Init(void)
{
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ƴ־<EFBFBD><EFBFBD><EFBFBD>
* @param x
* @param y
* @param width: <EFBFBD><EFBFBD><EFBFBD>εĿ<EFBFBD>
* @param height: <EFBFBD><EFBFBD><EFBFBD>εĸ<EFBFBD>
* @param color: <EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD>ɫ
* @param thickness: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void GE_GUI_ThickRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color, uint16_t thickness)
{
for (uint16_t i = 0; i < thickness; i++)
GE_Draw_Rectangle(x + i, y + i, width - 2 * i, height - 2 * i, color);
}
/**
* @brief <EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD>
* @param x
* @param y
* @param width: <EFBFBD><EFBFBD><EFBFBD>εĿ<EFBFBD>
* @param height: <EFBFBD><EFBFBD><EFBFBD>εĸ<EFBFBD>
* @param font_color: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @param fill_color: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
* @param rectangle_color: <EFBFBD>߿<EFBFBD><EFBFBD><EFBFBD>ɫ
* @param thickness: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param str: <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
*/
void GE_GUI_TextBox(
uint16_t x,
uint16_t y,
uint16_t width,
uint16_t height,
uint16_t font_color,
uint16_t fill_color,
uint16_t rectangle_color,
uint16_t thickness,
uint8_t *str)
{
GE_GUI_ThickRectangle(x, y, width, height, rectangle_color, thickness);
GE_Draw_Fill(x + thickness, y + thickness, width - 2 * thickness, height - 2 * thickness, fill_color);
GE_Font_Print(x + thickness + 1, y + thickness + 1, width - 2 * (thickness + 1), height - 2 * (thickness + 1), FONT_16, font_color, WHITE, TRUE, str);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˫Ȧ<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD>
* @param x: <EFBFBD><EFBFBD>Ȧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param y: <EFBFBD><EFBFBD>Ȧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param width: <EFBFBD><EFBFBD><EFBFBD>εĿ<EFBFBD>
* @param height: <EFBFBD><EFBFBD><EFBFBD>εĸ<EFBFBD>
* @param color: <EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD>ɫ
* @param thickness: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void GE_GUI_DoubleThickRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color, uint16_t thickness)
{
GE_GUI_ThickRectangle(x, y, width, height, color, thickness);
GE_GUI_ThickRectangle(x + thickness + 1, y + thickness + 1, width - (thickness + 1) * 2, height - (thickness + 1) * 2, color, thickness);
}
/**
* @brief <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD>ڡ<EFBFBD><EFBFBD>Զ<EFBFBD>ˢ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ
2021-08-10 15:00:09 +08:00
* @param x
* @param y
* @param width: <EFBFBD><EFBFBD><EFBFBD>ڵĿ<EFBFBD>
* @param height: <EFBFBD><EFBFBD><EFBFBD>ڵĸ<EFBFBD>
* @param head: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param content: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param handler_func: <EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ NULL <EFBFBD><EFBFBD>ִ<EFBFBD>лص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
*/
void GE_GUI_MsgBox(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t *head, uint8_t *content, MsgBoxHandler handler_func)
{
//<2F>߿<EFBFBD>
GE_GUI_DoubleThickRectangle(x, y, width, height, BLACK, 2);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>
GE_Draw_Rectangle(x + 5, y + FONT_16 + 7, width - 10, 2, BLACK);
//<2F><><EFBFBD><EFBFBD>
GE_Font_Print(x + 6, y + 6, BORDER_MAX, FONT_16, FONT_16, BLACK, WHITE, FALSE, head);
//<2F><><EFBFBD><EFBFBD>
GE_Font_Print(x + 6, y + FONT_16 + 10, width - 12, BORDER_MAX, FONT_16, BLACK, WHITE, FALSE, content);
GE_Draw_Disp();
KEY_ClearKey();
2021-08-10 15:00:09 +08:00
//<2F><><EFBFBD>ûص<C3BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
if (handler_func != NULL)
handler_func();
}
/**
* @brief <EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڡ<EFBFBD><EFBFBD>Զ<EFBFBD>ˢ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ
2021-08-10 15:00:09 +08:00
* @param x
* @param y
* @param width: <EFBFBD><EFBFBD><EFBFBD>ڵĿ<EFBFBD>
* @param height: <EFBFBD><EFBFBD><EFBFBD>ڵĸ<EFBFBD>
* @param head: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param content_amount: <EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param content: <EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param handler_func: <EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ NULL <EFBFBD><EFBFBD>ִ<EFBFBD>лص<EFBFBD>
* @retval <EFBFBD><EFBFBD>ѡ<EFBFBD>е<EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD>ʾ<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> JOY_L_DOWN <EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ûص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2021-08-10 15:00:09 +08:00
*/
uint8_t GE_GUI_MenuBox(
uint16_t x,
uint16_t y,
uint16_t width,
uint16_t height,
uint8_t *head,
uint8_t content_amount,
uint8_t content[][GE_GUI_MENUBOX_CONTENT_LEN],
MenuBoxHandler handler_func)
{
uint8_t choice_num = 1;
//<2F>߿<EFBFBD>
GE_GUI_DoubleThickRectangle(x, y, width, height, BLACK, 2);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>
GE_Draw_Rectangle(x + 5, y + FONT_16 + 7, width - 10, 2, BLACK);
//<2F><><EFBFBD><EFBFBD>
GE_Font_Print(x + 6, y + 6, BORDER_MAX, FONT_16, FONT_16, BLACK, WHITE, FALSE, head);
//<2F><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
for (uint8_t i = 0; i < content_amount; i++)
{
if (i + 1 == choice_num)
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + i * (FONT_16 + 3), width - 8, FONT_16 + 4, WHITE, BLUE, BLACK, 1, content[i]);
else
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + i * (FONT_16 + 3), width - 8, FONT_16 + 4, BLACK, WHITE, BLACK, 1, content[i]);
}
GE_Draw_Disp();
KEY_ClearKey();
2021-08-10 15:00:09 +08:00
while (1)
{
uint8_t key = KEY_GetKeyWait();
if (key == JOY_OK_UP)
2021-08-10 15:00:09 +08:00
{
break;
}
else if (key == JOY_L_DOWN)
{
return 0;
}
else if (key == JOY_U_DOWN && choice_num > 1)
2021-08-10 15:00:09 +08:00
{
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + (choice_num - 1) * (FONT_16 + 3), width - 8, FONT_16 + 4, BLACK, WHITE, BLACK, 1, content[choice_num - 1]);
choice_num--;
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + (choice_num - 1) * (FONT_16 + 3), width - 8, FONT_16 + 4, WHITE, BLUE, BLACK, 1, content[choice_num - 1]);
GE_Draw_Disp();
2021-08-10 15:00:09 +08:00
}
else if (key == JOY_D_DOWN && choice_num < content_amount)
2021-08-10 15:00:09 +08:00
{
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + (choice_num - 1) * (FONT_16 + 3), width - 8, FONT_16 + 4, BLACK, WHITE, BLACK, 1, content[choice_num - 1]);
choice_num++;
GE_GUI_TextBox(x + 4, y + FONT_16 + 8 + (choice_num - 1) * (FONT_16 + 3), width - 8, FONT_16 + 4, WHITE, BLUE, BLACK, 1, content[choice_num - 1]);
GE_Draw_Disp();
2021-08-10 15:00:09 +08:00
}
}
//<2F><><EFBFBD>ûص<C3BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
if (handler_func != NULL)
handler_func(choice_num);
return choice_num;
}