mirror of
https://gitee.com/Polarix/simplegui.git
synced 2025-06-18 05:57:53 +00:00
314 lines
11 KiB
C
314 lines
11 KiB
C
![]() |
/*************************************************************************/
|
||
|
/** Copyright. **/
|
||
|
/** FileName: GUI_VariableBox.c **/
|
||
|
/** Author: XuYulin **/
|
||
|
/** Version: 1.0.0.0 **/
|
||
|
/** Description: Show and change variable box. **/
|
||
|
/** History: **/
|
||
|
/** XuyYulin 2017/3/10 1.0.0.0 New create. **/
|
||
|
/** XuYulin 2017/3/10 1.0 build this moudle **/
|
||
|
/*************************************************************************/
|
||
|
|
||
|
//=======================================================================//
|
||
|
//= Include files. =//
|
||
|
//=======================================================================//
|
||
|
#include "GUI_Common.h"
|
||
|
#include "GUI_Basic.h"
|
||
|
#include "GUI_Text.h"
|
||
|
#include "GUI_VariableBox.h"
|
||
|
|
||
|
#include <stddef.h>
|
||
|
#include <stdint.h>
|
||
|
#include <stdbool.h>
|
||
|
#include <string.h>
|
||
|
//=======================================================================//
|
||
|
//= Static variable declaration. =//
|
||
|
//=======================================================================//
|
||
|
static char g_TextBuffer[VARBOX_TEXT_BUFFER_SIZE] = {0x00}; //Used when convert a number to text.
|
||
|
|
||
|
//=======================================================================//
|
||
|
//= Static function declaration. =//
|
||
|
//=======================================================================//
|
||
|
void GUI_TextVariableBox_UpdateCharacter(GUI_TXT_VARBOX_STRUCT* pstTextValue, char cNewCharacters, DRAW_MODE eMode);
|
||
|
|
||
|
//=======================================================================//
|
||
|
//= Function implementation. =//
|
||
|
//=======================================================================//
|
||
|
/*************************************************************************/
|
||
|
/** Function Name: GUI_RefreshVariableBox **/
|
||
|
/** Purpose: Display or refresh a integer value edit box. **/
|
||
|
/** Resources: 12 pix ASCII font data. **/
|
||
|
/** Params: **/
|
||
|
/** @pstValue: Value structure, include max value, min value **/
|
||
|
/** and current value. **/
|
||
|
/** @eAlignment: Alignment, might be right, center or left. **/
|
||
|
/** @eMode: Display mode, normal or reveres. **/
|
||
|
/** Return: None. **/
|
||
|
/** Notice: None. **/
|
||
|
/*************************************************************************/
|
||
|
void GUI_IntegerVariableBox_Refresh(GUI_INT_VARBOX_STRUCT* pstValue, GUI_VARBOX_ALIG eAlignment, DRAW_MODE eMode)
|
||
|
{
|
||
|
/*----------------------------------*/
|
||
|
/* Variable Declaration */
|
||
|
/*----------------------------------*/
|
||
|
RECTANGLE stTextDisplayArea;
|
||
|
RECTANGLE stTextDataArea;
|
||
|
size_t uiTextLength;
|
||
|
size_t uiTextWidth;
|
||
|
GUI_COLOR eBackColor;
|
||
|
|
||
|
/*----------------------------------*/
|
||
|
/* Initialize */
|
||
|
/*----------------------------------*/
|
||
|
eBackColor = ((eMode==GUI_DRAW_NORMAL)?GUI_COLOR_BKGCLR:GUI_COLOR_FRGCLR);
|
||
|
// Draw edge
|
||
|
GUI_Basic_DrawRectangle(pstValue->PosX, pstValue->PosY, pstValue->Width, VARBOX_HEIGHT, eBackColor, eBackColor);
|
||
|
|
||
|
/*----------------------------------*/
|
||
|
/* Process */
|
||
|
/*----------------------------------*/
|
||
|
|
||
|
if(NULL != pstValue)
|
||
|
{
|
||
|
// Check value limited.
|
||
|
if(pstValue->Value > pstValue->Max)
|
||
|
{
|
||
|
pstValue->Value = pstValue->Max;
|
||
|
}
|
||
|
if(pstValue->Value < pstValue->Min)
|
||
|
{
|
||
|
pstValue->Value = pstValue->Min;
|
||
|
}
|
||
|
// Convert number to string
|
||
|
uiTextLength = GUI_Common_IntegerToString(pstValue->Value, g_TextBuffer, 10, -1, ' ');
|
||
|
uiTextWidth = VARBOX_TEXT_WIDTH(uiTextLength);
|
||
|
stTextDisplayArea.PosX = pstValue->PosX+1;
|
||
|
stTextDisplayArea.PosY = pstValue->PosY+1;
|
||
|
stTextDisplayArea.Width = VARBOX_TEXT_AREA_WIDTH(pstValue->Width);
|
||
|
stTextDisplayArea.Height = g_stFontSize[VARBOX_FONT_SIZE].Height;
|
||
|
switch(eAlignment)
|
||
|
{
|
||
|
case GUI_RIGHT:
|
||
|
{
|
||
|
stTextDataArea.PosX = stTextDisplayArea.Width - uiTextWidth;
|
||
|
break;
|
||
|
}
|
||
|
case GUI_CENTER:
|
||
|
{
|
||
|
stTextDataArea.PosX = (stTextDisplayArea.Width - uiTextWidth) / 2;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
{
|
||
|
stTextDataArea.PosX = 0;
|
||
|
}
|
||
|
}
|
||
|
stTextDataArea.PosY = 0;
|
||
|
GUI_Text_DrawSingleLineText(g_TextBuffer, VARBOX_FONT_SIZE, &stTextDisplayArea, &stTextDataArea, eMode);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*************************************************************************/
|
||
|
/** Function Name: GUI_TextVariableBox_UpdateCharacter **/
|
||
|
/** Purpose: Display or refresh a integer value edit box. **/
|
||
|
/** Resources: 12 pix ASCII font data. **/
|
||
|
/** Params: **/
|
||
|
/** @pstTextValue: Text value edit box pointer. **/
|
||
|
/** @cNewCharacters: New character of value. **/
|
||
|
/** @eMode: Display mode, normal or reveres. **/
|
||
|
/** Return: None. **/
|
||
|
/** Notice: Static function, call by others interface. **/
|
||
|
/*************************************************************************/
|
||
|
void GUI_TextVariableBox_UpdateCharacter(GUI_TXT_VARBOX_STRUCT* pstTextValue, char cNewCharacters, DRAW_MODE eMode)
|
||
|
{
|
||
|
/*----------------------------------*/
|
||
|
/* Variable Declaration */
|
||
|
/*----------------------------------*/
|
||
|
GUI_COLOR eBackColor;
|
||
|
RECTANGLE stTextDisplayArea, stTextDataArea;
|
||
|
RECTANGLE stFocusArea;
|
||
|
uint16_t uiFontWidth, uiFontHeight;
|
||
|
uint16_t uiTextLength;
|
||
|
uint16_t uiFillIndex;
|
||
|
|
||
|
/*----------------------------------*/
|
||
|
/* Initialize */
|
||
|
/*----------------------------------*/
|
||
|
eBackColor = ((eMode==GUI_DRAW_NORMAL)?GUI_COLOR_BKGCLR:GUI_COLOR_FRGCLR);
|
||
|
// Draw edge
|
||
|
if(NULL != pstTextValue->Value)
|
||
|
{
|
||
|
GUI_Basic_DrawRectangle(pstTextValue->PosX, pstTextValue->PosY, pstTextValue->Width, VARBOX_HEIGHT, eBackColor, eBackColor);
|
||
|
}
|
||
|
// Get font graphics size.
|
||
|
uiFontWidth = g_stFontSize[VARBOX_FONT_SIZE].Width;
|
||
|
uiFontHeight = g_stFontSize[VARBOX_FONT_SIZE].Height;
|
||
|
|
||
|
/*----------------------------------*/
|
||
|
/* Process */
|
||
|
/*----------------------------------*/
|
||
|
if((NULL != pstTextValue) && (NULL != pstTextValue->Value))
|
||
|
{
|
||
|
// Get max text length and graphics width.
|
||
|
|
||
|
if(pstTextValue->MaxTextLength > VARBOX_TEXT_LENGTH_MAX)
|
||
|
{
|
||
|
pstTextValue->MaxTextLength = VARBOX_TEXT_LENGTH_MAX;
|
||
|
}
|
||
|
// Ignore too long text string.
|
||
|
uiTextLength = strlen(pstTextValue->Value);
|
||
|
if(uiTextLength > pstTextValue->MaxTextLength)
|
||
|
{
|
||
|
uiTextLength = pstTextValue->MaxTextLength;
|
||
|
*(pstTextValue->Value+uiTextLength) = '\0';
|
||
|
// Point at to last character position if index is more then string length.
|
||
|
if(pstTextValue->FocusIndex >= pstTextValue->MaxTextLength)
|
||
|
{
|
||
|
pstTextValue->FocusIndex = pstTextValue->MaxTextLength-1;
|
||
|
}
|
||
|
}
|
||
|
// Update character in text string when index is valid.
|
||
|
if(GUI_TEXT_ISASCII(cNewCharacters))
|
||
|
{
|
||
|
// Extend string with space if focus index is more then text length.
|
||
|
if(pstTextValue->FocusIndex >= uiTextLength)
|
||
|
{
|
||
|
uiFillIndex = uiTextLength;
|
||
|
while(uiFillIndex < pstTextValue->FocusIndex)
|
||
|
{
|
||
|
*(pstTextValue->Value+uiFillIndex) = ' ';
|
||
|
uiFillIndex++;
|
||
|
}
|
||
|
*(pstTextValue->Value+uiFillIndex) = cNewCharacters;
|
||
|
uiFillIndex++;
|
||
|
*(pstTextValue->Value+uiFillIndex) = '\0';
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
*(pstTextValue->Value+pstTextValue->FocusIndex) = cNewCharacters;
|
||
|
}
|
||
|
}
|
||
|
// Set text display area.
|
||
|
stTextDisplayArea.PosX = pstTextValue->PosX+1;
|
||
|
stTextDisplayArea.PosY = pstTextValue->PosY+1;
|
||
|
stTextDisplayArea.Width = VARBOX_TEXT_AREA_WIDTH(pstTextValue->Width);
|
||
|
stTextDisplayArea.Height = uiFontHeight;
|
||
|
stTextDataArea.PosX = 0;
|
||
|
stTextDataArea.PosY = 0;
|
||
|
|
||
|
// Set focus character area.
|
||
|
stFocusArea.PosX = stTextDisplayArea.PosX+pstTextValue->FocusIndex*uiFontWidth;
|
||
|
stFocusArea.PosY = stTextDisplayArea.PosY;
|
||
|
stFocusArea.Width = uiFontWidth;
|
||
|
stFocusArea.Height = uiFontHeight;
|
||
|
if(RECTANGLE_X_END(stFocusArea) > RECTANGLE_X_END(stTextDisplayArea))
|
||
|
{
|
||
|
stTextDataArea.PosX = RECTANGLE_X_END(stTextDisplayArea) - RECTANGLE_X_END(stFocusArea);
|
||
|
stFocusArea.PosX = stFocusArea.PosX + stTextDataArea.PosX;
|
||
|
}
|
||
|
// Display text.
|
||
|
GUI_Text_DrawSingleLineText(pstTextValue->Value, VARBOX_FONT_SIZE, &stTextDisplayArea, &stTextDataArea, eMode);
|
||
|
// Focus first character.
|
||
|
GUI_Basic_ReverseBlockColor(stFocusArea.PosX, stFocusArea.PosY, stFocusArea.Width, stFocusArea.Height);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*************************************************************************/
|
||
|
/** Function Name: GUI_TextVariableBox_Refresh **/
|
||
|
/** Purpose: Display or refresh a integer value edit box. **/
|
||
|
/** Resources: 12 pix ASCII font data. **/
|
||
|
/** Params: **/
|
||
|
/** @pstTextValue: Text value edit box pointer. **/
|
||
|
/** @eMode: Display mode, normal or reveres. **/
|
||
|
/** Return: None. **/
|
||
|
/** Notice: None. **/
|
||
|
/*************************************************************************/
|
||
|
void GUI_TextVariableBox_Refresh(GUI_TXT_VARBOX_STRUCT* pstTextValue, DRAW_MODE eMode)
|
||
|
{
|
||
|
|
||
|
/*----------------------------------*/
|
||
|
/* Process */
|
||
|
/*----------------------------------*/
|
||
|
if(NULL != pstTextValue)
|
||
|
{
|
||
|
if(NULL != pstTextValue->Value)
|
||
|
{
|
||
|
if(pstTextValue->FocusIndex >= pstTextValue->MaxTextLength)
|
||
|
{
|
||
|
pstTextValue->FocusIndex = pstTextValue->MaxTextLength-1;
|
||
|
}
|
||
|
GUI_TextVariableBox_UpdateCharacter(pstTextValue, '\0', eMode);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*************************************************************************/
|
||
|
/** Function Name: GUI_TextVariableBox_PrevCharacter **/
|
||
|
/** Purpose: Select previous character at current index. **/
|
||
|
/** Resources: 12 pix ASCII font data. **/
|
||
|
/** Params: **/
|
||
|
/** @pstTextValue: Text value edit box pointer. **/
|
||
|
/** @eMode: Display mode, normal or reveres. **/
|
||
|
/** @uiCharacterSet: Mask of characters set. **/
|
||
|
/** Return: None. **/
|
||
|
/** Notice: None. **/
|
||
|
/*************************************************************************/
|
||
|
void GUI_TextVariableBox_ChangeCharacter(GUI_TXT_VARBOX_STRUCT* pstTextValue, DRAW_MODE eMode, uint16_t uiCharacterSet, GUI_TXT_VARBOX_OPT eOpt)
|
||
|
{
|
||
|
/*----------------------------------*/
|
||
|
/* Variable Declaration */
|
||
|
/*----------------------------------*/
|
||
|
char cCurChar;
|
||
|
bool bUpdated;
|
||
|
|
||
|
/*----------------------------------*/
|
||
|
/* Initialize */
|
||
|
/*----------------------------------*/
|
||
|
cCurChar = '\0';
|
||
|
bUpdated = false;
|
||
|
/*----------------------------------*/
|
||
|
/* Process */
|
||
|
/*----------------------------------*/
|
||
|
if(NULL != pstTextValue)
|
||
|
{
|
||
|
if(NULL != pstTextValue->Value)
|
||
|
{
|
||
|
cCurChar = *(pstTextValue->Value+pstTextValue->FocusIndex);
|
||
|
while(false == bUpdated)
|
||
|
{
|
||
|
cCurChar += (int32_t)eOpt;
|
||
|
if(cCurChar > 0x7E)
|
||
|
{
|
||
|
cCurChar = 0x20;
|
||
|
}
|
||
|
if(cCurChar < 0x20)
|
||
|
{
|
||
|
cCurChar = 0x7E;
|
||
|
}
|
||
|
if(GUI_TEXT_ISDIGIT(cCurChar) || ('.' == cCurChar) || ('-' == cCurChar))
|
||
|
{
|
||
|
if(uiCharacterSet & GUI_TEXT_NUMBER)
|
||
|
{
|
||
|
bUpdated = true;
|
||
|
}
|
||
|
}
|
||
|
if(GUI_TEXT_ISALPHA(cCurChar))
|
||
|
{
|
||
|
if(uiCharacterSet & GUI_TEXT_ALPHA)
|
||
|
{
|
||
|
bUpdated = true;
|
||
|
}
|
||
|
}
|
||
|
if((!GUI_TEXT_ISDIGIT(cCurChar)) && (!(GUI_TEXT_ISALPHA(cCurChar))))
|
||
|
{
|
||
|
if(uiCharacterSet & GUI_TEXT_PUNCTUATION)
|
||
|
{
|
||
|
bUpdated = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
GUI_TextVariableBox_UpdateCharacter(pstTextValue, cCurChar, eMode);
|
||
|
}
|
||
|
}
|
||
|
}
|