📄 screen_obj_v1_02.c
字号:
#include "app_config.h"
#include "app_screen_obj.h"
void (*screen_init_func)(void);
unsigned char screen_init_flag = 0;
so_obj_t so_obj[MAX_SCR_OBJ];
unsigned char layer[MAX_SCR_OBJ];
unsigned char last_obj_id;
unsigned char last_on_obj_id;
unsigned char so_obj_is_white_null(so_pos_t lhpos,so_pos_t lvpos)
{
return (0);
}
void so_obj_task100ms_null(void)
{
}
void so_obj_up_null(unsigned char last_obj_id)
{
}
void so_obj_leave_null(unsigned char new_obj_id)
{
}
void so_obj_do_null(so_pos_t lhpos,so_pos_t lvpos,so_pos_t ghpos,so_pos_t gvpos,pstatus_t p_stat)
{
}
void so_obj_draw_null(void)
{
}
void ScrObjDraw(void) //draw active window from lowest layer to top layer
{
unsigned char obj_id;
int i;
for (i=MAX_SCR_OBJ-1; i>=0; i--)
{
obj_id = layer[i];
if (so_obj[obj_id].stat != SO_ST_OFF)
so_obj[obj_id].draw();
}
}
void ScrObjToTopLayer(unsigned char obj_id) //set this window to top and rearrange layer stack
{
unsigned char i;
unsigned char shift_flag = 0;
for (i=MAX_SCR_OBJ-1; i>0; i--)
{
if (layer[i] == obj_id)
{
shift_flag = 1;
}
if (shift_flag)
{
layer[i] = layer[i-1];
}
}
layer[0] = obj_id;
}
void ScrObjRemoveLayer(unsigned char obj_id)
{
unsigned char i;
unsigned char shift_flag = 0;
for (i=0; i<MAX_SCR_OBJ-1; i++)
{
if (layer[i] == obj_id)
{
shift_flag = 1;
}
if (shift_flag)
{
layer[i] = layer[i+1];
}
}
layer[MAX_SCR_OBJ - 1] = obj_id;
}
int ScrObjDo(so_pos_t ghpos,so_pos_t gvpos,pstatus_t p_stat) //return object id or -1 when nothing found
{
unsigned char i,obj_id;
unsigned short hmin,vmin,hmax,vmax;
so_pos_t lhpos,lvpos;
int found_obj_id = -1;
switch (p_stat)
{
case PST_DOWN : //find from top layer
for (i=0; i<MAX_SCR_OBJ; i++)
{
obj_id = layer[i];
if (so_obj[obj_id].stat != SO_ST_OFF)
{
hmin = so_obj[obj_id].horigin;
vmin = so_obj[obj_id].vorigin;
hmax = so_obj[obj_id].horigin + so_obj[obj_id].hsize;
vmax = so_obj[obj_id].vorigin + so_obj[obj_id].vsize;
if (hmax > SCREEN_HSIZE - 1)
hmax = SCREEN_HSIZE - 1;
if (vmax > SCREEN_VSIZE - 1)
vmax = SCREEN_VSIZE - 1;
if ((ghpos >= hmin) && (ghpos < hmax) && (gvpos >= vmin) && (gvpos < vmax))
{
lhpos = ghpos - hmin;
lvpos = gvpos - vmin;
if (!so_obj[obj_id].is_white(lhpos,lvpos))
{
if ((last_on_obj_id != obj_id) && (last_on_obj_id < MAX_SCR_OBJ))
so_obj[last_on_obj_id].leave(obj_id);
if (last_on_obj_id != obj_id)
so_obj[obj_id].up(last_on_obj_id);
so_obj[obj_id].do_(lhpos,lvpos,ghpos,gvpos,p_stat);
last_obj_id = obj_id;
found_obj_id = obj_id;
last_on_obj_id = obj_id;
break;
}
}
}
}
if ((found_obj_id == -1)&& (last_on_obj_id < MAX_SCR_OBJ))
{
so_obj[last_on_obj_id].leave(obj_id);
last_on_obj_id = MAX_SCR_OBJ;
}
break;
case PST_NOTFOUND :
found_obj_id = -1;
break;
default : //PST_HOLD and PST_UP -> use last top layer
if (last_obj_id != MAX_SCR_OBJ)
{
obj_id = last_obj_id;
hmin = so_obj[obj_id].horigin;
vmin = so_obj[obj_id].vorigin;
hmax = so_obj[obj_id].horigin + so_obj[obj_id].hsize;
vmax = so_obj[obj_id].vorigin + so_obj[obj_id].vsize;
if (hmax > SCREEN_HSIZE - 1)
hmax = SCREEN_HSIZE - 1;
if (vmax > SCREEN_VSIZE - 1)
vmax = SCREEN_VSIZE - 1;
lhpos = ghpos - hmin; //this can be negative value!!!
lvpos = gvpos - vmin; //this can be negative value!!!
so_obj[obj_id].do_(lhpos,lvpos,ghpos,gvpos,p_stat);
found_obj_id = last_obj_id;
}
if (p_stat == PST_UP)
{
last_obj_id = MAX_SCR_OBJ;
}
break;
}
return (found_obj_id);
}
void ScrObjSetFocus(unsigned char obj_id)
{
last_on_obj_id = obj_id;
}
void ScrObjInit(void (*first_screen_init_func)(void))
{
screen_init_func = first_screen_init_func;
screen_init_flag = 1;
}
void scr_obj_init(void)
{
int i;
for (i=0; i<MAX_SCR_OBJ; i++)
{
layer[i] = i;
so_obj[i].stat = SO_ST_OFF;
so_obj[i].is_white = so_obj_is_white_null;
so_obj[i].task100ms = so_obj_task100ms_null;
so_obj[i].up = so_obj_up_null;
so_obj[i].leave = so_obj_leave_null;
so_obj[i].do_ = so_obj_do_null;
so_obj[i].draw = so_obj_draw_null;
}
last_obj_id = MAX_SCR_OBJ;
last_on_obj_id = MAX_SCR_OBJ;
screen_init_func();
ScrObjDraw();
screen_init_flag = 0;
}
void ScrObjTask100ms(void)
{
unsigned char i;
if (screen_init_flag)
{
scr_obj_init();
}
for (i=0; i<MAX_SCR_OBJ; i++)
{
if (so_obj[i].stat != SO_ST_OFF)
so_obj[i].task100ms();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -