895 lines
24 KiB
C
895 lines
24 KiB
C
#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;
|
||
}
|