hschumann2/TempleOS-Source-Code
0838
1 2CTask *JukeReward(U8 *msg)3{4 U8 *buf;5 CDoc *doc;6 CTask *res=Spawn(&SrvCmdLine,NULL,"Reward",,Fs);7 StrCpy(res->task_title,"Reward");8 res->title_src=TTS_LOCKED_CONST;9 10 doc=DocNew(,res);11 DocPrint(doc,"$WW+H,1$$RED$%s",msg);12 13 buf=MStrPrint("DocEd(0x%X);",doc);14 TaskExe(res,NULL,buf,1<<JOBf_EXIT_ON_COMPLETE|1<<JOBf_FREE_ON_COMPLETE);15 Free(buf);16 TaskWait(res);17 18 res->border_src =BDS_CONST;19 res->border_attr=LTGRAY<<4+DrvTextAttrGet(':')&15;20 res->text_attr =LTGRAY<<4+BLUE;21 res->win_inhibit=WIG_NO_FOCUS_TASK_DFT;22 WinHorz(Fs->win_right+2,TEXT_COLS-2,res);23 WinVert(2,TEXT_ROWS-2,res);24 25 WinFocus(Fs->parent_task);26 return res;27}28 29CTask *SingleSong(U8 *msg,U8 *name)30{31 CTask *task=Spawn(&SrvCmdLine,NULL,name,,Fs);32 StrCpy(task->task_title,name);33 task->title_src=TTS_LOCKED_CONST;34 TaskExe(task,Fs,";",1<<JOBf_WAKE_MASTER|1<<JOBf_FREE_ON_COMPLETE);35 WinHorz(task->win_left,task->win_left+50,task);36 WinVert(2,2+8,task);37 task->win_inhibit=WIG_NO_FOCUS_TASK_DFT;38 TaskExe(task,NULL,msg,1<<JOBf_EXIT_ON_COMPLETE|1<<JOBf_FREE_ON_COMPLETE);39 DocPut(task)->max_entries=100;40 return task;41}42 43#define JB_RUN_LEVEL_NULL 044#define JB_RUN_LEVEL_ONE 145#define JB_RUN_LEVEL_TWO 246 47Bool JBPutKey(CDoc *doc,U8 *,I64 ch,I64 sc)48{//ch=ASCII; sc=scan_code49 CDocEntry *doc_ce=doc->cur_entry,*doc_e;50 CDirEntry *tmpde;51 I64 i;52 U8 *st;53 CDoc *doc2;54 if (!(sc&(SCF_ALT|SCF_CTRL|SCF_SHIFT))55 && doc_ce->type_u8==DOCT_MENU_VAL && doc_ce->left_exp>=0) {56 tmpde=doc_ce->left_exp;57 if (sc.u8[0]==SC_DELETE ) {58 Beep;59 Silent;60 Del(tmpde->full_name);61 Silent(OFF);62 } else if ('0'<=ch<='9') {63 if (StrLen(doc_ce->tag)>1)64 doc_ce->tag[0]=ch;65 doc2=DocRead(tmpde->full_name);66 DocGoToLine(doc2,1);67 doc_e=doc2->cur_entry;68 if (doc_e!=doc2 && doc_e->type_u8==DOCT_TEXT && StrLen(doc_e->tag)>=3) {69 doc_e->tag[2]=ch;70 DocWrite(doc2);71 }72 DocDel(doc2);73 return TRUE;74 } else if (ch=='r') {75 if (!DocTreeFFind(tmpde->full_name,"Reward1")) {76 doc2=DocRead(tmpde->full_name);77 DocGoToLine(doc2,2);78 DocPrint(doc2,79 "\n$TR,\"Reward1\"$\n"80 "$ID,2$CallExtStr(\"JukeReward\",\"\"\n"81 "$TR,\"Reward2\"$\n"82 "$ID,2$\n"83 "$ID,-2$\n"84 ");\n$ID,-2$\n"85 );86 DocWrite(doc2);87 DocDel(doc2);88 }89 if (DocTreeFFind(tmpde->full_name,"Reward1/Reward2")) {90 for (i=0;i<5;i++) {91 st=MStrPrint("%s %s %s %s ",92 GodWordStr,GodWordStr,GodWordStr,GodWordStr);93 DocTreeFAppend(tmpde->full_name,"Reward1/Reward2",94 "\"%s\"\n",st);95 Free(st);96 }97 In(" ");98 }99 return TRUE;100 } else if (ch==CH_SPACE||ch==CH_ESC)101 tmpde->user_data++; //JB_RUN_LEVEL++102//<SPACE> is followed by <ESC> --> JB_RUN_LEVEL_TWO103 //Actual <ESC> just exits --> JB_RUN_LEVEL_ONE104 }105 return FALSE;106}107 108public U0 JukeBox(U8 *dirname="~/Psalmody",U8 **_filename=NULL)109{//_filename is for using this as a song-chooser program.110 I64 i=0,rating;111 U8 *st,*st2;112 CDirEntry *tmpde,*tmpde1;113 CDoc *doc=DocNew,*s;114 CDocEntry *doc_e;115 CTask *task=NULL;116 if (_filename)117 *_filename=NULL;118 SettingsPush; //See SettingsPush119 AutoComplete;120 try {121 dirname=StrNew(dirname);122 st=MStrPrint("%s/*.HC.Z",dirname);123 tmpde=tmpde1=FilesFind(st);124 Free(st);125 Free(dirname);126 doc->user_put_key=&JBPutKey;127 DocPrint(doc,128 "Key: $GREEN$Graphics $BLUE$Words $RED$No Nothing "129 "$BLACK$Incomplete $CYAN$Special$FG$\n\n"130 "$GREEN$<DEL>$FG$\tto delete a song.\n"131 "'$GREEN$0$FG$'-'$GREEN$9$FG$'\tto rate a song.\n"132 "'$GREEN$r$FG$'\tto get your reward from God.\n");133 while (tmpde) {134 if (!(i++%5))135 DocPrint(doc,"\n");136 if (FileOcc("Play(",tmpde->full_name,"")) {137 st=StrNew(tmpde->name);138 FileExtRem(st);139 s=DocRead(tmpde->full_name);140 doc_e=s->head.next;141 while (doc_e!=s && doc_e->type_u8!=DOCT_TEXT)142 doc_e=doc_e->next;143 rating='0';144 if (doc_e!=s && doc_e->type_u8==DOCT_TEXT) {145 if ('0'<=doc_e->tag[2]<='9')146 rating=doc_e->tag[2];147 if (StrMatch("incomplete",doc_e->tag))148 DocPrint(doc,"$BLACK$");149 else if (StrMatch("has graphics",doc_e->tag))150 DocPrint(doc,"$GREEN$");151 else if (StrMatch("has words",doc_e->tag))152 DocPrint(doc,"$BLUE$");153 else if (StrMatch("special",doc_e->tag))154 DocPrint(doc,"$CYAN$");155 else if (StrMatch("no nothing",doc_e->tag)) {156 DocPrint(doc,"$RED$");157 if (FileOcc("\\0",tmpde->full_name,"")) {158 s->cur_entry=doc_e->next;159 s->cur_col=0;160 DocEntryDel(s,doc_e);161 DocPrint(s,"//0 has words\n");162 DocWrite(s);163 }164 }165 DocPrint(doc,"$MU-UL,\"%c%-8ts\",LE=%d$ ",rating,st,tmpde);166 tmpde->user_data=JB_RUN_LEVEL_NULL;167 }168 DocDel(s);169 Free(st);170 }171 tmpde=tmpde->next;172 }173 DocPrint(doc,"\n$CYAN$$MU-UL,\"DONE\",LE=%d$\n",DOCM_CANCEL);174 while (TRUE) {175 if (_filename)176 tmpde=PopUpMenu(doc,DOF_INTERCEPT_TASK_END);177 else178 tmpde=PopUpMenu(doc);179 if (task)180 Kill(task);181 if (tmpde<=0) break;182 st2=StrNew(tmpde->name);183 if (_filename) {184 Free(*_filename);185 *_filename=StrNew(tmpde->full_name);186 }187 if (tmpde->user_data==JB_RUN_LEVEL_ONE) break; //<ESC>188 tmpde->user_data=JB_RUN_LEVEL_NULL; //Rst from <SPACE>189 FileExtRem(st2);190 st=MStrPrint("ExeFile(\"%s\");",tmpde->full_name);191 MusicSettingsRst;192 task=SingleSong(st,st2);193 Free(st2);194 Free(st);195 }196 DocDel(doc);197 DirTreeDel(tmpde1);198 } catch199 PutExcept;200 SettingsPop;201}202 