Files
player/Project/Src/MyWinApp/mywin_user_filder.c
2025-07-10 00:08:56 +08:00

895 lines
24 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mywin_inc.h"
#include "ff.h"
#include "nes_main.h"
#include "gif.h"
#include "system_updata.h"
#include "avi.h"
#include "mywin_user_photo.h"
#include "mywin_user_animation.h"
#include "mywin_music.h"
#include "mywin_user_filder.h"
#include "elf.h"
#include "lcd_rgb.h"
#include "tools.h"
#include "nrf.h"
#include "mywin_user_debug.h"
#include "string.h"
#include "char_encode.h"
// 文件管理器
#define WIN_FILDER_TYPE "WIN_FilderStruct"
static const char *g_popup_itmes[] =
{
"打开",
"重命名",
"复制到系统文件",
"文件信息",
"删除文件",
"发送",
};
void FILDER_Delete(WIN_FilderStruct *up);
WIN_FilderStruct *WIN_CreatFilder(WIN_WindowStruct *base,
void (*msgLoop)(struct _WIN_WindowStruct *win, WIN_MsgStruct *msg),
int x, int y, int x_size, int y_size)
{
// 重设消息循环
if (msgLoop == 0)
{
msgLoop = (void (*)(struct _WIN_WindowStruct *win, WIN_MsgStruct *msg))FILDER_defaultMsgLoop;
}
WIN_FilderStruct *ret = mymalloc_exm(sizeof(WIN_FilderStruct));
// 调用父类的构造函数
if (ret)
{
mymemset(ret, 0, sizeof(WIN_FilderStruct));
// if (0==WIN_CreatWindowExt((WIN_WindowStruct *)ret,base,msgLoop,x,y,x_size,y_size))
if (0 == WIN_CreatTouchEx((WIN_TouchWinStruct *)ret, base, msgLoop, x, y, x_size, y_size))
{
// 创建失败
myfree(ret);
ret = 0;
}
else
{
// 构造
((WIN_WindowStruct *)ret)->winType = WIN_FILDER_TYPE;
((WIN_WindowStruct *)ret)->deleteWindow = (void (*)(struct _WIN_WindowStruct *win))FILDER_Delete;
((WIN_WindowStruct *)ret)->bkcolor = 0x808080;
((WIN_WindowStruct *)ret)->color = 0xffffff;
((WIN_WindowStruct *)ret)->intercept = 1; // 不发送按键消息到父窗口
ret->titleHight = 30;
ret->itemHight = 30;
ret->itemIndent = 35;
ret->scrollbar_xsize = 10;
ret->itemNumOnePage = (((WIN_WindowStruct *)ret)->y_size - ret->titleHight) / ret->itemHight;
ret->itemHight = (((WIN_WindowStruct *)ret)->y_size - ret->titleHight) / ret->itemNumOnePage;
ret->imgDir = 0;
ret->imgFile = 0;
tools_updata_on();
}
}
return ret;
}
void FILDER_Delete(WIN_FilderStruct *up)
{
tools_updata_off();
// 调用父类的销毁函数
WIN_DeleteWindow((WIN_WindowStruct *)up);
}
// 设置文件索引
int FILDER_SetIndex(WIN_FilderStruct *filder, int index);
// 设置文件路径,同时扫描路径下的文件
void FILDER_SetFileDir(WIN_FilderStruct *filder, char *dir)
{
mymemcpy(filder->dirName, dir, strlen(dir));
FILDER_ClearItem(filder);
FILDER_ScanFile(filder);
}
// 清空条目
void FILDER_ClearItem(WIN_FilderStruct *filder)
{
filder->fileNum = 0;
filder->firstItemOnPage = 0;
filder->dirNum = 0;
filder->file[0].name[0] = 0;
FILDER_SetIndex(filder, 0);
}
// 添加一个文件条目
void FILDER_AddItem(WIN_FilderStruct *filder, Filder_FildInfo *file)
{
if (filder->fileNum < FILDER_FILE_MAXNUM)
{
mymemcpy(&filder->file[filder->fileNum], file, sizeof(Filder_FildInfo));
filder->fileNum++;
// 如果是文件夹文件夹数目加1
if (file->type == FILDER_DIR_TYPE)
{
filder->dirNum++;
}
}
}
// 在指定位置插入一个条目
void FILDER_InsertItem(WIN_FilderStruct *filder, Filder_FildInfo *file, int index)
{
if (index < 0)
return;
if (filder->fileNum < FILDER_FILE_MAXNUM)
{
// 在列表中间插入条目
if (index < filder->fileNum)
{
// 先向后移动,留出位置
for (int i = filder->fileNum - 1; i >= index; i--)
{
mymemcpy(&filder->file[i + 1], &filder->file[i], sizeof(Filder_FildInfo));
}
// 插入条目
mymemcpy(&filder->file[index], file, sizeof(Filder_FildInfo));
filder->fileNum++;
// 如果是文件夹文件夹数目加1
if (file->type == FILDER_DIR_TYPE)
{
filder->dirNum++;
}
}
else
{
FILDER_AddItem(filder, file);
}
}
}
// 入栈
int FILDER_PathPush(WIN_FilderStruct *filder)
{
if (filder->path.fileNum < FILDER_DIR_DEPTH)
{
for (int i = filder->path.fileNum; i > 0; i--)
{
filder->path.first[i] = filder->path.first[i - 1];
filder->path.index[i] = filder->path.index[i - 1];
}
filder->path.first[0] = filder->firstItemOnPage;
filder->path.index[0] = filder->index;
filder->path.fileNum++;
return 0;
}
return -1;
}
// 出栈
int FILDER_PathPull(WIN_FilderStruct *filder)
{
if (filder->path.fileNum)
{
filder->firstItemOnPage = filder->path.first[0];
filder->index = filder->path.index[0];
filder->path.fileNum--;
for (int i = 0; i < filder->path.fileNum; i++)
{
filder->path.first[i] = filder->path.first[i + 1];
filder->path.index[i] = filder->path.index[i + 1];
}
return 0;
}
return -1;
}
// 把文件名追加到目录,同时扫描路径下的文件,目标不是目录时返回-1
int FILDER_DirAppend(WIN_FilderStruct *filder, Filder_FildInfo *file)
{
int dir_len = strlen(filder->dirName);
if (file->type == FILDER_DIR_TYPE)
{
filder->dirName[dir_len] = '/';
dir_len++;
mymemcpy(&filder->dirName[dir_len], file->name, strlen(file->name) + 1);
FILDER_PathPush(filder);
FILDER_ClearItem(filder);
FILDER_ScanFile(filder);
FILDER_SetIndex(filder, 0);
return 0;
}
else
{
return -1;
}
}
// 剪短一层目录,同时扫描目录下的文件,不能简短时返回-1
int FILDER_DirCut(WIN_FilderStruct *filder)
{
int dir_len = strlen(filder->dirName);
if (dir_len == 0)
return -1;
char *ptr_name = &filder->dirName[dir_len - 1];
while (*ptr_name && (*ptr_name != '/') && (*ptr_name != ':'))
{
*ptr_name = 0;
ptr_name--;
}
if (*ptr_name == '/')
{
*ptr_name = 0;
FILDER_ClearItem(filder);
FILDER_PathPull(filder);
FILDER_ScanFile(filder);
FILDER_SetIndex(filder, filder->index);
return 0;
}
else
{
return -1;
}
}
// 生成文件路径
void FILDER_GetFileRoute(WIN_FilderStruct *filder)
{
int dir_len = strlen(filder->dirName);
mymemcpy(filder->fileName, filder->dirName, dir_len + 1);
filder->fileName[dir_len] = '/';
dir_len++;
mymemcpy(&filder->fileName[dir_len], filder->file[filder->index].name, strlen(filder->file[filder->index].name) + 1);
}
// 扫描文件
void FILDER_ScanFile(WIN_FilderStruct *filder)
{
FRESULT ret = FR_OK;
DIR dir = {0};
FILINFO *file_info = 0;
Filder_FildInfo *file_info_x = 0;
file_info = mymalloc(sizeof(FILINFO));
file_info_x = mymalloc(sizeof(Filder_FildInfo));
ret = f_findfirst(&dir, file_info, filder->dirName, "*");
while ((ret == FR_OK) && (file_info->fname[0] != 0))
{
mymemcpy(file_info_x->name, file_info->fname, strlen(file_info->fname) + 1);
file_info_x->size = file_info->fsize;
if (AM_DIR & file_info->fattrib)
{
file_info_x->type = FILDER_DIR_TYPE;
}
else
{
file_info_x->type = FILDER_FILE_TYPE;
}
if (filder->fileNum < FILDER_FILE_MAXNUM)
{
if (file_info_x->type == FILDER_DIR_TYPE)
{
FILDER_InsertItem(filder, file_info_x, filder->dirNum);
}
else
{
FILDER_AddItem(filder, file_info_x);
}
}
else
{
break;
}
ret = f_findnext(&dir, file_info);
}
myfree(file_info);
myfree(file_info_x);
}
// 打开文件
void FILDER_OpenFile(WIN_FilderStruct *filder)
{
int str_len = strlen(filder->file[filder->index].name);
char *p_str = &filder->file[filder->index].name[str_len - 4];
if (strcmp(p_str, ".jpg") == 0)
{
FILDER_GetFileRoute(filder);
PHOTO_ShowPhoto((WIN_WindowStruct *)filder, filder->fileName);
}
else if (strcmp(p_str, ".bmp") == 0)
{
FILDER_GetFileRoute(filder);
PHOTO_ShowPhoto((WIN_WindowStruct *)filder, filder->fileName);
}
else if (strcmp(p_str, ".png") == 0)
{
FILDER_GetFileRoute(filder);
PHOTO_ShowPhoto((WIN_WindowStruct *)filder, filder->fileName);
}
else if (strcmp(p_str, ".pic") == 0)
{
FILDER_GetFileRoute(filder);
WIN_PicStruct pic = {0};
u32 file_size = 0;
u8 *data = 0;
FIL *file = mymalloc(sizeof(FIL));
FILINFO *file_info = mymalloc(sizeof(FILINFO));
UINT br;
u8 res = 0;
f_stat((char *)filder->fileName, file_info);
data = mymalloc(file_info->fsize);
f_open(file, (char *)filder->fileName, FA_READ);
f_read(file, data, file_info->fsize, &br);
f_close(file);
res = WIN_GetImageSize((u8 *)data, &pic.xsize, &pic.ysize);
if (res == 0)
{
pic.data = (u16 *)(data + 8);
}
PHOTO_ShowPic((WIN_WindowStruct *)filder, &pic);
myfree(data);
myfree(file);
myfree(file_info);
}
else if (strcmp(p_str, ".gif") == 0)
{
FILDER_GetFileRoute(filder);
ANIMATION_ShowGif((WIN_WindowStruct *)filder, (char *)filder->fileName);
}
else if ((strcmp(p_str, ".nes") == 0) || (strcmp(p_str, ".NES") == 0))
{
FILDER_GetFileRoute(filder);
WIN_KeyShieldOn();
nes_load ((u8*)filder->fileName,LCD_GetShowAddr(),LCD_GetLcdSizeX()/2-128,LCD_GetLcdSizeY()/2-120);
WIN_KeyShieldOff();
}
else if (strcmp(p_str, ".avi") == 0)
{
FILDER_GetFileRoute(filder);
WIN_KeyShieldOn();
int ret = video_play(filder->fileName, 0);
WIN_KeyShieldOff();
}
else if (strcmp(p_str, ".mp3") == 0)
{
FILDER_GetFileRoute(filder);
MUSIC_PlaySong((WIN_WindowStruct *)filder, filder->fileName);
}
else if (strcmp(p_str, ".axf") == 0)
{
// 执行程序文件
FILDER_GetFileRoute(filder);
app_run_path(filder->fileName);
}
else if (strcmp(p_str, ".lua") == 0)
{
// 执行lua脚本
FILDER_GetFileRoute(filder);
DEBUG_EnterPrintCmd(filder->fileName);
}
else
{
MSGBOX_TipsTime((WIN_WindowStruct *)filder, "提示", "不支持的文件", "确定", 5000);
}
}
void FILDER_PaintItem(WIN_FilderStruct *filder, int index)
{
if (index < 0 || index >= filder->fileNum)
return;
int x = 0;
int y = filder->titleHight + filder->y_off + (index - filder->firstItemOnPage) * filder->itemHight;
int x_size = ((WIN_WindowStruct *)filder)->x_size;
int y_size = filder->itemHight;
Filder_FildInfo *file = &filder->file[index];
// 显示图标
int img_xsize = 0;
int img_ysize = 0;
char *img = 0;
if (file->type == FILDER_DIR_TYPE)
{
img = filder->imgDir;
}
else
{
img = filder->imgFile;
}
if (img)
{
WIN_PicStruct *pic = WIN_GetPic(img);
if (pic)
{
WIN_DrawPic(pic, x + (filder->itemIndent - pic->xsize) / 2, y + (y_size - img_ysize) / 2,
pic->xsize, pic->ysize);
}
}
// 显示文件名
// RECT_Struct rs={0};//用于裁剪绘图区的矩形
// rs.x=x+filder->itemIndent;rs.y=y;
// rs.x_size=x_size-filder->scrollbar_xsize-filder->itemIndent-1;
// rs.y_size=y_size;
// WIN_SetWinInvalidRect (((WIN_WindowStruct *)filder),&rs);
if (index == filder->index)
WIN_DrawTxtAt(file->name, x + filder->itemIndent + filder->scroll_x, y + y_size / 2 - WIN_GetFontHight() / 2);
else
WIN_DrawTxtAt(file->name, x + filder->itemIndent, y + y_size / 2 - WIN_GetFontHight() / 2);
}
// 绘制函数
void FILDER_DefaultPaint(WIN_FilderStruct *filder)
{
// 使用双缓冲,防止闪烁
// LCD_LayerBufferOn();
int x = 0;
int y = 0;
int x_size = ((WIN_WindowStruct *)filder)->x_size;
int y_size = ((WIN_WindowStruct *)filder)->y_size;
char txt_buff[20] = {0};
WIN_PaintBackGround((WIN_WindowStruct *)filder);
// 绘制滚动条
int scrollbar_x = x_size - filder->scrollbar_xsize;
int scrollbar_y = y + filder->titleHight;
int scrollbar_xsize = filder->scrollbar_xsize;
int scrollbar_ysize = y_size - scrollbar_y;
int scrollbar_tstart = filder->firstItemOnPage * scrollbar_ysize / filder->fileNum;
int scrollbar_tsize = filder->itemNumOnePage * scrollbar_ysize / filder->fileNum;
WIN_SetLcdColor(((WIN_WindowStruct *)filder)->color);
WIN_DrawHLine(scrollbar_x, scrollbar_y, scrollbar_x + scrollbar_xsize - 1);
WIN_DrawHLine(scrollbar_x, scrollbar_y + scrollbar_ysize - 1, scrollbar_x + scrollbar_xsize - 1);
WIN_DrawVLine(scrollbar_x, scrollbar_y, scrollbar_y + scrollbar_ysize - 1);
WIN_DrawVLine(scrollbar_x + scrollbar_xsize - 1, scrollbar_y, scrollbar_y + scrollbar_ysize - 1);
WIN_FillRectByColor(scrollbar_x, scrollbar_y + scrollbar_tstart, scrollbar_xsize, scrollbar_tsize);
// 显示标题
WIN_SetFontMode(WIN_DRAWMODE_ALONE);
WIN_DrawTxtHCenterAt("文件管理器", x_size / 2, filder->titleHight / 2 - WIN_GetFontHight() / 2);
// 显示文件信息
sprintf(txt_buff, "%d/%d", filder->index + 1, filder->fileNum);
WIN_DrawTxtAt(txt_buff, x_size - WIN_GetFontWidth() * strlen(txt_buff) / 2 - 1, filder->titleHight / 2 - WIN_GetFontHight() / 2);
// 显示选中框
int selete_x = x;
int selete_y = y + filder->titleHight;
int selete_xsize = x_size - scrollbar_xsize - 1;
int selete_ysize = filder->itemHight;
WIN_SetLcdColor(0x00ffff);
selete_y += filder->itemHight * (filder->index - filder->firstItemOnPage);
WIN_FillRectByColorAlpha(selete_x, selete_y, selete_xsize, selete_ysize, 16);
// 显示文件
RECT_Struct rs = {0}; // 用于裁剪绘图区的矩形
rs.x = x;
rs.y = y + filder->titleHight;
rs.x_size = x_size - scrollbar_xsize - 1;
rs.y_size = y_size - rs.y;
WIN_SetLcdColor(((WIN_WindowStruct *)filder)->color);
WIN_SetWinInvalidRect(((WIN_WindowStruct *)filder), &rs);
for (int i = 0; i < filder->itemNumOnePage + 2; i++)
{
FILDER_PaintItem(filder, i + filder->firstItemOnPage - 1);
}
WIN_SetWinInvalidRect(((WIN_WindowStruct *)filder), 0);
}
typedef struct
{
char *name;
char *path;
} sysfile_updata_struct;
static int sysfile_updata(void *ptr)
{
sysfile_updata_struct *t = ptr;
SysFile_Updata(t->name, t->path);
return 0;
}
static void FILDER_Down(WIN_FilderStruct *filder)
{
if (filder->index < filder->fileNum - 1)
{
FILDER_SetIndex(filder, filder->index + 1);
if (filder->index >= filder->firstItemOnPage + filder->itemNumOnePage)
{
filder->firstItemOnPage++;
}
}
else
{
FILDER_SetIndex(filder, 0);
filder->firstItemOnPage = 0;
}
}
static void FILDER_Up(WIN_FilderStruct *filder)
{
if (filder->index > 0)
{
FILDER_SetIndex(filder, filder->index - 1);
if (filder->index < filder->firstItemOnPage)
{
filder->firstItemOnPage--;
}
}
else
{
FILDER_SetIndex(filder, filder->fileNum - 1);
if (filder->fileNum > filder->itemNumOnePage)
filder->firstItemOnPage = filder->fileNum - filder->itemNumOnePage;
else
filder->firstItemOnPage = 0;
}
}
static int g_send_file(void *t);
static int set_progress(int now, int all);
static void get_progress(int *now, int *all);
static int g_send(void *data, int size);
static void FILDER_Enter(WIN_FilderStruct *filder, int x, int y)
{
// 打开
if (FILDER_DirAppend(filder, &filder->file[filder->index]) == -1)
{
// 是文件,在此做文件的处理
int index = POPUP_SelectItem((WIN_WindowStruct *)filder, (char **)g_popup_itmes, 6, x, y);
if (index == 0)
{
FILDER_OpenFile(filder);
}
else if (index == 1)
{
// 重命名
char *txt_buff = mymalloc(256);
mymemcpy(txt_buff, filder->file[filder->index].name, strlen(filder->file[filder->index].name) + 1);
if (INPUT_KeyBoard((WIN_WindowStruct *)filder, txt_buff, 256) == 1)
{
char *txt_path_old = mymalloc(256);
FILDER_GetFileRoute(filder);
mymemcpy(txt_path_old, filder->fileName, strlen(filder->fileName) + 1); // 原始路径
mymemcpy(filder->file[filder->index].name, txt_buff, strlen(txt_buff) + 1); // 新文件名
FILDER_GetFileRoute(filder); // 新路径
if (f_rename(txt_path_old, filder->fileName) == FR_OK)
{
MSGBOX_TipsTime((WIN_WindowStruct *)filder, "提示", "文件名修改成功", "确定", 5000);
}
else
{
MSGBOX_TipsTime((WIN_WindowStruct *)filder, "提示", "文件名修改失败", "确定", 5000);
}
myfree(txt_path_old);
}
myfree(txt_buff);
}
else if (index == 2)
{
// 复制到系统文件
FILDER_GetFileRoute(filder);
// SysFile_Updata (filder->file[filder->index].name,filder->fileName);
sysfile_updata_struct upd = {0};
upd.name = filder->file[filder->index].name;
upd.path = filder->fileName;
WORKING_DoWork((WIN_WindowStruct *)filder, "正在复制文件到系统。。。", sysfile_updata, &upd);
MSGBOX_TipsTime((WIN_WindowStruct *)filder, "提示", "已复制到系统文件", "确定", 5000);
}
else if (index == 3)
{
// 文件信息
char *txt_buff = mymalloc(512);
FILDER_GetFileRoute(filder);
sprintf(txt_buff, "路径:%s\n大小:%u Byte", filder->fileName, (uint32_t)filder->file[filder->index].size);
MSGBOX_Tips((WIN_WindowStruct *)filder, "文件信息", txt_buff, "确定");
myfree(txt_buff);
}
else if (index == 4)
{
// 删除
if (MSGBOX_Inquiry((WIN_WindowStruct *)filder, "警告", "确定删除这个文件吗?", "确定", "取消") == 0)
{
FILDER_GetFileRoute(filder);
if (f_unlink(filder->fileName) == FR_OK)
{
MSGBOX_TipsTime((WIN_WindowStruct *)filder, "提示", "文件已删除", "确定", 5000);
FILDER_ClearItem(filder);
FILDER_ScanFile(filder);
}
else
{
MSGBOX_TipsTime((WIN_WindowStruct *)filder, "提示", "删除文件失败", "确定", 5000);
}
}
}
else if (index == 5)
{
// 发送
FILDER_GetFileRoute(filder);
SysFile_SendStruct send;
SysFile_SendFileInit(&send, filder->file[filder->index].name, filder->fileName,
g_send, set_progress);
int ret = WORKING_DoWorkPro((WIN_WindowStruct *)filder, "正在发送文件", g_send_file, &send,
0, 0, get_progress, 25);
if (ret == 0)
MSGBOX_TipsTime((WIN_WindowStruct *)filder, "提示", "文件发送成功", "确定", 5000);
else
MSGBOX_TipsTime((WIN_WindowStruct *)filder, "提示", "文件发送失败", "确定", 5000);
}
} // if (FILDER_DirAppend (filder,&filder->file[filder->index])==-1)
}
static int g_send_now;
static int g_send_all;
static int set_progress(int now, int all)
{
g_send_now = now;
g_send_all = all;
return 0;
}
static void get_progress(int *now, int *all)
{
*now = g_send_now;
*all = g_send_all;
}
static int g_send(void *data, int size)
{
if (nrf_send(data, size, 0) == NRF_OK)
return 0;
else
return -1;
}
static int g_send_file(void *t)
{
g_send_now = 0;
g_send_all = 0;
SysFile_SendStruct *send = t;
int ret = 0;
ret = SysFile_SendFileName(send);
if (ret != 0)
return ret;
ret = SysFile_SendFileInfo(send);
if (ret != 0)
return ret;
ret = SysFile_SendFileData(send);
return ret;
}
static void FILDER_Home(WIN_FilderStruct *filder)
{
// 后退
if (FILDER_DirCut(filder) == -1)
{
// 是根目录了,退出文件管理器
((WIN_WindowStruct *)filder)->deleteWindow((WIN_WindowStruct *)filder);
}
}
int FILDER_GetTouchIndex(WIN_FilderStruct *filder, int x, int y)
{
if (y < filder->titleHight)
return -1;
return (y - filder->titleHight) / filder->itemHight + filder->firstItemOnPage;
}
int FILDER_SetIndex(WIN_FilderStruct *filder, int index)
{
int x_size = ((WIN_WindowStruct *)filder)->x_size - filder->itemIndent;
Filder_FildInfo *file = &filder->file[index];
filder->scroll_xsize = (strlen(file->name) + 4) * WIN_GetFontWidth() / 2;
if (filder->scroll_xsize > x_size)
{
if (filder->scroll_timer == 0)
filder->scroll_timer = WIN_CreatTimer((WIN_WindowStruct *)filder, 50);
}
else
{
if (filder->scroll_timer)
WIN_DeleteTimer(filder->scroll_timer);
filder->scroll_timer = 0;
}
filder->index = index;
filder->scroll_x = 0;
return 0;
}
void FILDER_ScrollTimer(WIN_FilderStruct *filder)
{
int x_size = ((WIN_WindowStruct *)filder)->x_size - filder->itemIndent;
int y = (filder->index - filder->firstItemOnPage) * filder->itemHight + filder->titleHight;
if (filder->scroll_x + filder->scroll_xsize > x_size)
{
filder->scroll_x -= 3;
}
else
{
filder->scroll_x = 4 * WIN_GetFontWidth() / 2;
}
WIN_SetInvalidRectWhenTop((WIN_WindowStruct *)filder, filder->itemIndent, y, x_size, filder->itemHight);
}
#define FIRST_ADD() \
{ \
if (filder->firstItemOnPage < filder->fileNum - filder->itemNumOnePage) \
{ \
filder->firstItemOnPage++; \
if (filder->index < filder->firstItemOnPage) \
FILDER_SetIndex(filder, filder->firstItemOnPage); \
filder->y_off += filder->itemHight; \
} \
else \
filder->y_off = 0; \
}
#define FIRST_SUB() \
{ \
if (filder->firstItemOnPage > 0) \
{ \
filder->firstItemOnPage--; \
if (filder->index > filder->firstItemOnPage + filder->itemNumOnePage - 1) \
FILDER_SetIndex(filder, filder->firstItemOnPage + filder->itemNumOnePage - 1); \
filder->y_off -= filder->itemHight; \
} \
else \
filder->y_off = 0; \
}
#define IS_MIDDLE() (filder->firstItemOnPage > 0 || m->y_move < 0) && (filder->firstItemOnPage < filder->fileNum - filder->itemNumOnePage || m->y_move > 0)
// 消息处理函数
void FILDER_defaultMsgLoop(WIN_FilderStruct *filder, WIN_MsgStruct *msg)
{
WIN_MoveStruct *m = 0;
WIN_KeyStruct *k = 0;
switch (msg->msg)
{
case WIN_MSG_PAINT:
FILDER_DefaultPaint(filder);
break;
case WIN_MSG_TIMER:
if (msg->data.v == filder->scroll_timer)
{
FILDER_ScrollTimer(filder);
}
break;
case WIN_MSG_KEY:
k = msg->data.p;
// 收到确定或返回键
if (k->shortPress & KEY_VALUE_DOWN)
{
FILDER_Down(filder);
} // if (k->shortPress&KEY_VALUE_DOWN)
else if (k->shortPress & KEY_VALUE_UP)
{
FILDER_Up(filder);
} // else if (k->shortPress&KEY_VALUE_UP)
else if (k->shortPress & KEY_VALUE_ENTER)
{
FILDER_Enter(filder, 100, 100);
}
else if (k->shortPress & KEY_VALUE_HOME)
{
FILDER_Home(filder);
}
if (k->shortPress)
{
WIN_SetInvalid((WIN_WindowStruct *)filder);
}
break; // case WIN_MSG_KEY:
case WIN_MSG_MOVE:
m = msg->data.p;
switch (m->moveType)
{
case MOVE_DATA_SHORT:
{
int index = FILDER_GetTouchIndex(filder, m->x_move, m->y_move);
if (index == filder->index)
{
FILDER_Enter(filder, m->x_move, m->y_move);
}
else if (index != -1)
{
FILDER_SetIndex(filder, index);
}
else
{
FILDER_Home(filder);
}
WIN_SetInvalid((WIN_WindowStruct *)filder);
}
break;
case MOVE_DATA_MOVED:
if (IS_MIDDLE())
{
filder->y_off += m->y_move;
if (filder->y_off >= filder->itemHight)
{
FIRST_SUB();
}
else if (filder->y_off <= -filder->itemHight)
{
FIRST_ADD();
}
if (m->y_move == 0 && m->x_move == 0)
{
filder->y_off = 0;
}
}
else
{
filder->y_off = 0;
}
WIN_SetInvalidWhenTop((WIN_WindowStruct *)filder);
break;
default:
WIN_DefaultMsgLoop((WIN_WindowStruct *)filder, msg);
break;
}
break;
case WIN_MSG_CHID:
switch (msg->data.v)
{
case CHID_DELETE:
break;
case CHID_USER:
{
if (msg->data2.v == BUTTON_PRESSED)
{
// if (msg->srcWin==filder->key_back)
// {
// //返回
// FILDER_Home(filder);
// }
// else if (msg->srcWin==filder->key_up)
// {
// FILDER_Up(filder);
// }
// else if (msg->srcWin==filder->key_down)
// {
// FILDER_Down(filder);
// }
// else if (msg->srcWin==filder->key_enter)
// {
// FILDER_Enter(filder);
// }
// WIN_SetInvalid((WIN_WindowStruct *)filder);
}
}
break;
default:
break;
}
break;
default:
WIN_DefaultMsgLoop((WIN_WindowStruct *)filder, msg);
break;
}
}
// 选则文件
int FILDER_ChooseFile(WIN_WindowStruct *win, char *dir)
{
WIN_FilderStruct *filder = 0;
if (win)
{
filder = WIN_CreatFilder(win, 0, 0, 0, win->x_size, win->y_size);
}
else
filder = WIN_CreatFilder(0, 0, 0, 0, WIN_GetWinStruct()->lcd->getLcdSizeX(), WIN_GetWinStruct()->lcd->getLcdSizeY());
WIN_SetBackPicPath((WIN_WindowStruct *)filder, win->pic_path);
FILDER_SetFileDir(filder, dir);
WIN_ShowWindow((WIN_WindowStruct *)filder);
// return WIN_RunBlock ((WIN_WindowStruct *)filder);
return 0;
}