ZealOS/Distro/Apps/Psalmody/JukeBox.HC
2020-02-15 14:01:48 -06:00

200 lines
5.4 KiB
HolyC
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

CTask *JukeReward(U8 *msg)
{
U8 *buf;
CDoc *doc;
CTask *res=Spawn(&SrvCmdLine,NULL,"Reward",,Fs);
StrCpy(res->task_title,"Reward");
res->title_src=TTS_LOCKED_CONST;
doc=DocNew(,res);
DocPrint(doc,"$$WW+H,1$$$$RED$$%s",msg);
buf=MStrPrint("DocEd(0x%X);",doc);
TaskExe(res,NULL,buf,1<<JOBf_EXIT_ON_COMPLETE|1<<JOBf_FREE_ON_COMPLETE);
Free(buf);
TaskWait(res);
res->border_src =BDS_CONST;
res->border_attr=LTGRAY<<4+DrvTextAttrGet(':')&15;
res->text_attr =LTGRAY<<4+BLUE;
res->win_inhibit=WIG_NO_FOCUS_TASK_DFT;
WinHorz(Fs->win_right+2,TEXT_COLS-2,res);
WinVert(2,TEXT_ROWS-2,res);
WinFocus(Fs->parent_task);
return res;
}
CTask *SingleSong(U8 *msg,U8 *name)
{
CTask *task=Spawn(&SrvCmdLine,NULL,name,,Fs);
StrCpy(task->task_title,name);
task->title_src=TTS_LOCKED_CONST;
TaskExe(task,Fs,";",1<<JOBf_WAKE_MASTER|1<<JOBf_FREE_ON_COMPLETE);
WinHorz(task->win_left,task->win_left+50,task);
WinVert(2,2+8,task);
task->win_inhibit=WIG_NO_FOCUS_TASK_DFT;
TaskExe(task,NULL,msg,1<<JOBf_EXIT_ON_COMPLETE|1<<JOBf_FREE_ON_COMPLETE);
DocPut(task)->max_entries=100;
return task;
}
#define JB_RUN_LEVEL_NULL 0
#define JB_RUN_LEVEL_ONE 1
#define JB_RUN_LEVEL_TWO 2
Bool JBPutKey(CDoc *doc,U8 *,I64 ch,I64 sc)
{//ch=ASCII; sc=scan_code
CDocEntry *doc_ce=doc->cur_entry,*doc_e;
CDirEntry *tmpde;
I64 i;
U8 *st;
CDoc *doc2;
if (!(sc&(SCF_ALT|SCF_CTRL|SCF_SHIFT))
&& doc_ce->type_u8==DOCT_MENU_VAL && doc_ce->left_exp>=0) {
tmpde=doc_ce->left_exp;
if (sc.u8[0]==SC_DELETE ) {
Beep;
Silent;
Del(tmpde->full_name);
Silent(OFF);
} else if ('0'<=ch<='9') {
if (StrLen(doc_ce->tag)>1)
doc_ce->tag[0]=ch;
doc2=DocRead(tmpde->full_name);
DocGoToLine(doc2,1);
doc_e=doc2->cur_entry;
if (doc_e!=doc2 && doc_e->type_u8==DOCT_TEXT && StrLen(doc_e->tag)>=3) {
doc_e->tag[2]=ch;
DocWrite(doc2);
}
DocDel(doc2);
return TRUE;
} else if (ch=='r') {
if (!DocTreeFFind(tmpde->full_name,"Reward1")) {
doc2=DocRead(tmpde->full_name);
DocGoToLine(doc2,2);
DocPrint(doc2,
"\n$$TR,\"Reward1\"$$\n"
"$$ID,2$$CallExtStr(\"JukeReward\",\"\"\n"
"$$TR,\"Reward2\"$$\n"
"$$ID,2$$\n"
"$$ID,-2$$\n"
");\n$$ID,-2$$\n"
);
DocWrite(doc2);
DocDel(doc2);
}
if (DocTreeFFind(tmpde->full_name,"Reward1/Reward2")) {
for (i=0;i<5;i++) {
st=MStrPrint("%s %s %s %s ",
GodWordStr,GodWordStr,GodWordStr,GodWordStr);
DocTreeFAppend(tmpde->full_name,"Reward1/Reward2",
"\"%s\"\n",st);
Free(st);
}
In("");
}
return TRUE;
} else if (ch==CH_SPACE||ch==CH_ESC)
tmpde->user_data++; //JB_RUN_LEVEL++
//<SPACE> is followed by <ESC> --> JB_RUN_LEVEL_TWO
//Actual <ESC> just exits--> JB_RUN_LEVEL_ONE
}
return FALSE;
}
public U0 JukeBox(U8 *dirname="~/Psalmody",U8 **_filename=NULL)
{//_filename is for using this as a song-chooser program.
I64 i=0,rating;
U8 *st,*st2;
CDirEntry *tmpde,*tmpde1;
CDoc *doc=DocNew,*s;
CDocEntry *doc_e;
CTask *task=NULL;
if (_filename)
*_filename=NULL;
SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$
AutoComplete;
try {
dirname=StrNew(dirname);
st=MStrPrint("%s/*.HC",dirname);
tmpde=tmpde1=FilesFind(st);
Free(st);
Free(dirname);
doc->user_put_key=&JBPutKey;
DocPrint(doc,
"Key: $$GREEN$$Graphics $$BLUE$$Words $$RED$$No Nothing "
"$$BLACK$$Incomplete $$CYAN$$Special$$FG$$\n\n"
"$$GREEN$$<DEL>$$FG$$\tto delete a song.\n"
"'$$GREEN$$0$$FG$$'-'$$GREEN$$9$$FG$$'\tto rate a song.\n"
"'$$GREEN$$r$$FG$$'\tto get your reward from God.\n");
while (tmpde) {
if (!(i++%5))
DocPrint(doc,"\n");
if (FileOcc("Play(",tmpde->full_name,"")) {
st=StrNew(tmpde->name);
FileExtRem(st);
s=DocRead(tmpde->full_name);
doc_e=s->head.next;
while (doc_e!=s && doc_e->type_u8!=DOCT_TEXT)
doc_e=doc_e->next;
rating='0';
if (doc_e!=s && doc_e->type_u8==DOCT_TEXT) {
if ('0'<=doc_e->tag[2]<='9')
rating=doc_e->tag[2];
if (StrMatch("incomplete",doc_e->tag))
DocPrint(doc,"$$BLACK$$");
else if (StrMatch("has graphics",doc_e->tag))
DocPrint(doc,"$$GREEN$$");
else if (StrMatch("has words",doc_e->tag))
DocPrint(doc,"$$BLUE$$");
else if (StrMatch("special",doc_e->tag))
DocPrint(doc,"$$CYAN$$");
else if (StrMatch("no nothing",doc_e->tag)) {
DocPrint(doc,"$$RED$$");
if (FileOcc("\\0",tmpde->full_name,"")) {
s->cur_entry=doc_e->next;
s->cur_col=0;
DocEntryDel(s,doc_e);
DocPrint(s,"//0 has words\n");
DocWrite(s);
}
}
DocPrint(doc,"$$MU-UL,\"%c%-8ts\",LE=%d$$ ",rating,st,tmpde);
tmpde->user_data=JB_RUN_LEVEL_NULL;
}
DocDel(s);
Free(st);
}
tmpde=tmpde->next;
}
DocPrint(doc,"\n$$CYAN$$$$MU-UL,\"DONE\",LE=%d$$\n",DOCM_CANCEL);
while (TRUE) {
if (_filename)
tmpde=PopUpMenu(doc,DOF_INTERCEPT_TASK_END);
else
tmpde=PopUpMenu(doc);
if (task)
Kill(task);
if (tmpde<=0) break;
st2=StrNew(tmpde->name);
if (_filename) {
Free(*_filename);
*_filename=StrNew(tmpde->full_name);
}
if (tmpde->user_data==JB_RUN_LEVEL_ONE) break; //<ESC>
tmpde->user_data=JB_RUN_LEVEL_NULL; //Rst from <SPACE>
FileExtRem(st2);
st=MStrPrint("ExeFile(\"%s\");",tmpde->full_name);
MusicSettingsRst;
task=SingleSong(st,st2);
Free(st2);
Free(st);
}
DocDel(doc);
DirTreeDel(tmpde1);
} catch
PutExcept;
SettingsPop;
}