book_mark.c

来自「redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是B」· C语言 代码 · 共 285 行

C
285
字号
#include <csagb.h>
#include <rb_stdio.h>
#include <graph.h>
#include <Qgraph.h>
#define book_mark_M 440 //电子书书签设置 20*12=240字节
#define book_mark_M2 8600 //10*12=120 电子书签二区(用于自动存档)
#define SET_BAS 10344
#define fbase 0x80E1000
extern u8 is_basic_run;
u32 _fid=0,_iid=0,_line=0;
u32 _bmark_id=0;
extern char _file[40];//选定文件
extern u32 _file_loc;
extern void nsh_text(char *tit,char *txt,u32 size);
extern void ebook(char *tit,char *ebk);
typedef struct
{
   u32 fid;//书签相关的文件编号
   u32 iid;//书签相关的文件内部编号
   u32 line;//对应该文本的项目
} book_mark;

typedef struct //文件屬性
{
	u8 type;//文件類型
	u8 mask;//數據加密類型
	char name[40];//文件名
	u32 size;//文件大小
	u32 loc;//文件地址
} fileMes;

typedef struct
{
	char ftype[4];//文件类型码 "EBK"
	u32 size;//文件大小
	u32 icnt;//项目个数
	u32 logo;//logo位图信息
	u32 mus;//music信息
	u32 re;//保留区
}ebk_head;//ebk文件头

typedef struct
{
	char name[40];//名称
	u32 loc;//项目地址
	u32 csize;//压缩后大小
	u32 dsize;//解压后大小
}ebk_item;//项目信息

void set_bmark(u8 id,book_mark mark)
{
   if (id>29) return;
   if (id>19) CS_SeekInSRAM(SRAM_SEEK_START,SET_BAS+book_mark_M2+id*sizeof(book_mark));
   else CS_SeekInSRAM(SRAM_SEEK_START,SET_BAS+book_mark_M+id*sizeof(book_mark));
   CS_SaveToSRAM(&mark,sizeof(book_mark));//保存书签
}

void get_bmark(u8 id,book_mark *mark)
{
   if (id>19) CS_SeekInSRAM(SRAM_SEEK_START,SET_BAS+book_mark_M2+id*sizeof(book_mark));
   else CS_SeekInSRAM(SRAM_SEEK_START,SET_BAS+book_mark_M+id*sizeof(book_mark));
   CS_LoadFromSRAM(mark,sizeof(book_mark));//取得书签
}

void bmar_init()
{
   book_mark mark={0,0,0};
   u8 i;
   for (i=0;i<29;i++) set_bmark(i,mark);
}
u8 find_bmark(u32 fid)//寻找相关的书签
{
   u8 i=0;
   book_mark mark;
   for (i=0;i<20;i++)
   {
      get_bmark(i,&mark);
      if (mark.fid==fid) return i;
   }
   return 0;//没有找到
}


void auto_bmark()//自动保存书签
{
   u8 i,id=0,tid=0;
   book_mark mark;
   //arlt("AA","AA");
   if (_fid==0) {_bmark_id=0;return;}
   if (_bmark_id>19 && _bmark_id<30)
   {
      get_bmark(_bmark_id,&mark);
      if (mark.fid==_fid)
      {
         mark.iid=_iid;
         mark.line=_line;
         set_bmark(_bmark_id,mark);
         return;
      }
   }
   for (i=20;i<30;i++)
   {
      get_bmark(i,&mark);
      if (mark.fid==0 && tid==0) tid=i;
      if (mark.fid==_fid) {id=i;break;}
   }
   if (id==0) id=tid;
   if (id==0) id=20;
   mark.fid=_fid;
   mark.iid=_iid;
   mark.line=_line;
   set_bmark(id,mark);
   _bmark_id=id;
}

void bmark_mes(u8 id,u8 loc,book_mark mark)//显示书签信息
{
   fileMes mes;
   ebk_item item;
   char ids[4]="00\0";
   if (id>29)
   {
      Q_box(1,18+loc*28,238,18+26+loc*28,32733);
      return;
   }
   ids[0]=48+(int)(id/10);
   ids[1]=48+id%10;
   Q_box(1,18+loc*28,238,18+26+loc*28,32733);
   r_box(2,18+loc*28,237,18+26+loc*28,RGB(3,7,15),0);
   cwrite(3,20+loc*28,RGB(30,0,0),ids);
   if (mark.fid<=0x8000000 || mark.fid>=0x80000000) cwrite(20,20+loc*28,RGB(3,7,15),"没有使用");
   else
   {
      mes=*(fileMes *)mark.fid;
      cwrite(20,20+loc*28,RGB(3,7,15),mes.name);
      if (mark.iid<0xFFFF0000)
      {
         item=*(ebk_item *)(fbase+mes.loc+sizeof(ebk_head)+mark.iid*sizeof(ebk_item));
         cwrite(3,20+12+loc*28,RGB(3,7,15),item.name);
      }
   }
   //cwrite(3,20+12+loc*28,RGB(3,7,15),"中英文");
}
void list_bmark(u8 bg,u8 act)
{
   int i;
   u8 sel=0,old=0,np=bg;
   u8 start=1,done=2;
   fileMes mes;
   book_mark mark,nmark={0,0,0};
   is_basic_run=0;
   if (act) title("书签设置:[A:保存 R:删除 L:载入]");
   else title("请选择要打开的书签[R:删除书签]");
   r_line(0,0,239,0,28160,0);
   r_line(0,159,239,159,28160,0);
   r_line(0,0,0,159,28160,0);
   r_line(239,0,239,159,28160,0);
   r_line(0,16,239,16,28160,0);
   Q_box(1,17,238,158,32733);
   while (1)
   {
      if (start) {CS_ReadKey();start=0;}
      else readkey();
      if (CS_IsKeyDown(KEY_UP) && np+sel)
      {
         if (sel) {sel--;done=1;}
         else {np--;done=2;}
      }
      else if (CS_IsKeyDown(KEY_DOWN) && np+sel<29)
      {
         if (sel<4) {sel++;done=1;}
         else {np++;done=2;}
      }
      else if(CS_IsKeyDown(KEY_LEFT) && np+sel)
      {
         if (np>4) {np-=5;done=2;}
         else {np=0;sel=0;done=2;}
      }
      else if(CS_IsKeyDown(KEY_RIGHT) && np+sel<29)
      {
         done=2;
         if (np>24) {np=29;sel=0;}
         else
         {
            np+=5;
            if (np+sel>29) sel=29-sel;
         }
      }
      else if(CS_IsKeyDown(KEY_B)) return;
      else if(act && CS_IsKeyDown(KEY_L))
      {
         if (_iid>=0xFFFFFFF0) arlt("非法操作:","请在电子书阅读器下执行此操作.");
         else
         {
            get_bmark(np+sel,&mark);
            if (mark.iid>=0xFFFFFFF0 || mark.fid==0) arlt("操作无效:","您打开的不是电子书存栏.");
            else if (arlt("系统提示:","您真的要打开此书签存栏而放弃当前电子书吗?"))
            {
               is_basic_run=1;
               _fid=mark.fid;
               _iid=mark.iid;
               _line=mark.line;
               mes=*(fileMes *)_fid;
               _file_loc=fbase+mes.loc;
               strcpy(_file,mes.name);
               return;
            }
         }
      }
      else if(CS_IsKeyDown(KEY_A))//相关操作
      {
         if (act)//保存书签
         {
            if (_fid==0)
            {
               arlt("错误操作:","该对象不能保存书签!");
               return;
            }
            if (arlt("系统提示:","保存书签将覆盖原有记录,是否继续?\n[A:确定]  [B:取消]"))
            {
               mark.fid=_fid;
               mark.iid=_iid;
               mark.line=_line;
               set_bmark(np+sel,mark);
               return;
            }
         }
         else //读书签
         {
            is_basic_run=1;
            get_bmark(np+sel,&mark);
            _fid=mark.fid;
            _iid=mark.iid;
            _line=mark.line;
            if (_fid)
            {
               mes=*(fileMes *)_fid;
               if (_iid<0xFFFF0000)//是电子书
               ebook(mes.name,fbase+mes.loc);
               else nsh_text(mes.name,(char *)(fbase+mes.loc),mes.size);//是文本文件
               done=2;
               title("请选择要打开的书签[R:删除书签]");
               r_line(0,0,239,0,28160,0);
               r_line(0,159,239,159,28160,0);
               r_line(0,0,0,159,28160,0);
               r_line(239,0,239,159,28160,0);
               r_line(0,16,239,16,28160,0);
               Q_box(1,17,238,158,32733);
            }
            is_basic_run=0;
         }
         //
      }
      else if(CS_IsKeyDown(KEY_R))//删除
      {
         if (arlt("删除书签:","你真的要删除此书签吗?\n[A:确定]  [B:取消]"))
         set_bmark(np+sel,nmark);
         done=2;
      }
      if (done==2)
      {
         for (i=0;i<5;i++)
         {
            if (i+np>29) break;
            get_bmark(i+np,&mark);
            bmark_mes(i+np,i,mark);
         }
         while (i<5)
         {
            bmark_mes(30,i,mark);
            i++;
         }
         old=sel;
      }
      if (done)
      {
         if (old!=sel) r_box(3,19+old*28,236,17+26+old*28,0,5);
         r_box(3,19+sel*28,236,17+26+sel*28,0,5);
         old=sel;
         done=0;
      }
   }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?