/* This file is part of vdr-filebrowser. vdr-filebrowser is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. vdr-filebrowser is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Foobar. If not, see . */ #include #include "menu-filebrowser.h" #include "menu-threads.h" #include "tools.h" #include "threads.h" cOsdMenuThreadList::cOsdMenuThreadList(cFilebrowserStatebag* Statebag) : cOsdMenu(tr("Running threads")) { this->Statebag=Statebag; cThreadContainer* i=Statebag->GetThreads()->First(); while(i) { D(fprintf(stderr, "Adding Thread %s (Remove %s)\n", i->GetObject()->GetDescription(), i->GetObject()->IsRemoveRequested() ? "true" : "false")); if(i->GetObject()->IsRemoveRequested()) { cThreadContainer* tmp=i; i=Statebag->GetThreads()->Next(i); Statebag->GetThreads()->Del(tmp); continue; } cOsdItem* Item=new cOsdItem(""); UpdateMenuItem(Item, i->GetObject()); Add(Item); i=Statebag->GetThreads()->Next(i); } } eOSState cOsdMenuThreadList::ProcessKey(eKeys Key) { eOSState retval=cOsdMenu::ProcessKey(Key); if(retval==(eOSState)osFilebrowserCloseRefresh) { CloseSubMenu(); retval=osContinue; } if(retval!=osUnknown) { return retval; } switch(Key) { case kNone: cOsdItem* Item; Item=First(); for(cThreadContainer* i=Statebag->GetThreads()->First(); i && Item; i=Statebag->GetThreads()->Next(i)) { UpdateMenuItem(Item, i->GetObject()); Item=(cOsdItem*)Item->Next(); } Display(); break; case kOk: if(Current()<0) { return osBack; } AddSubMenu(Statebag->GetThreads()->Get(Current())->GetObject()->GetMenu()); retval=osContinue; break; case kBack: return (eOSState)osFilebrowserCloseRefresh; break; case kYellow: if(Current()>=0) { cCommandThread* Thread=Statebag->GetThreads()->Get(Current())->GetObject(); switch(Thread->GetState()) { case tsPaused: Thread->Resume(); break; case tsRunning: Thread->Pause(); break; default: //do nothing break; } } retval=osContinue; break; case kBlue: if(Current()>=0) { cCommandThread* Thread=Statebag->GetThreads()->Get(Current())->GetObject(); if(Thread->Active()) { if(Interface->Confirm(tr("Kill?"))) { Thread->Cancel(); UpdateMenuItem(Get(Current()), Thread); } } else { Statebag->GetThreads()->Del(Statebag->GetThreads()->Get(Current())); Del(Current()); } UpdateHelp(); Display(); } retval=osContinue; default: break; } return retval; } void cOsdMenuThreadList::OsdCurrentItem(const char *Text) { if(HasSubMenu()) { return; } UpdateHelp(); } void cOsdMenuThreadList::UpdateHelp() { if(Current()>=0 && Count() > 0) { cCommandThread* Thread=Statebag->GetThreads()->Get(Current())->GetObject(); SetHelp("", "", Thread->GetState()==tsPaused ? tr("Resume") : (Thread->GetState()==tsRunning ? tr("Pause") : ""), Thread->Active() ? tr("Kill") : tr("Remove")); } else { SetHelp("", "", "", ""); } } void cOsdMenuThreadList::UpdateMenuItem(cOsdItem* Item, cCommandThread* Thread) { char* Text=(char*)malloc(strlen(Thread->GetDescription()) + strlen(tr("Active")) + strlen(tr("Finished")) + strlen(tr("Paused")) + 4); switch(Thread->GetState()) { case tsRunning: sprintf(Text, "%s [%s]", Thread->GetDescription(), tr("Running")); break; case tsPaused: sprintf(Text, "%s [%s]", Thread->GetDescription(), tr("Paused")); break; default: sprintf(Text, "%s [%s]", Thread->GetDescription(), tr("Finished")); break; } Item->SetText(Text); free(Text); }