diff options
author | Martin Prochnow <nordlicht@martins-kabuff.de> | 2006-03-09 15:01:38 +0100 |
---|---|---|
committer | Andreas Mair <andreas@vdr-developer.org> | 2006-03-09 15:01:38 +0100 |
commit | 93372f4ecc69a079c0e5c5af9169f39222983667 (patch) | |
tree | f341ea604e6fd1a8e175ee78a70cab88a6006623 /mymenurecordings.c | |
download | vdr-plugin-extrecmenu-93372f4ecc69a079c0e5c5af9169f39222983667.tar.gz vdr-plugin-extrecmenu-93372f4ecc69a079c0e5c5af9169f39222983667.tar.bz2 |
Version 0.1 (Initial revision).v0.1
Diffstat (limited to 'mymenurecordings.c')
-rw-r--r-- | mymenurecordings.c | 357 |
1 files changed, 357 insertions, 0 deletions
diff --git a/mymenurecordings.c b/mymenurecordings.c new file mode 100644 index 0000000..e1bf15b --- /dev/null +++ b/mymenurecordings.c @@ -0,0 +1,357 @@ +#include "extrecmenu.h" + +// --- myMenuRecordingsItem --------------------------------------------------- +myMenuRecordingsItem::myMenuRecordingsItem(cRecording *Recording,int Level) +{ + name=NULL; + filename=Recording->FileName(); + + // get the level of this recording + level=0; + const char *s=Recording->Name(); + while(*++s) + { + if(*s=='~') + level++; + } + + // create the title of this item + if(Level<level) + { + s=Recording->Name(); + while(Level) + { + s=strchr(Recording->Name(),'~')+1; + Level--; + } + title=strdup(s); + char *p=strchr(title,'~'); + if(p) + *p=0; + name=strdup(title); + } + else + if(Level==level) + { + s=strrchr(Recording->Name(),'~'); + if(s) + title=strdup(s+1); + else + title=strdup(Recording->Name()); + } + else + if(Level>level) + { + title=""; + } + + SetText(title); +} + +myMenuRecordingsItem::~myMenuRecordingsItem() +{ + free(title); + free(name); +} + +// --- myMenuRecordings ------------------------------------------------------- +myMenuRecordings::myMenuRecordings(const char *Base,int Level):cOsdMenu(Base?Base:tr(DESCRIPTION)) +{ + edit=false; + level=Level; + helpkeys=-1; + base=Base?strdup(Base):NULL; + + Set(); + SetHelpKeys(); +} + +myMenuRecordings::~myMenuRecordings() +{ + free(base); +} + +void myMenuRecordings::Set() +{ + char *lastitemtext=NULL; + + cThreadLock RecordingsLock(&Recordings); + Clear(); + Recordings.Sort(); + + // add first the directories + for(cRecording *recording=Recordings.First();recording;recording=Recordings.Next(recording)) + { + if(!base||(strstr(recording->Name(),base)==recording->Name()&&recording->Name()[strlen(base)]=='~')) + { + myMenuRecordingsItem *item=new myMenuRecordingsItem(recording,level); + if(item->IsDirectory()&&*item->Text()&&(!lastitemtext||strcmp(lastitemtext,item->Text()))) + { + Add(item); + free(lastitemtext); + lastitemtext=strdup(item->Text()); + } + else + delete item; + } + } + // and now the recordings + for(cRecording *recording=Recordings.First();recording;recording=Recordings.Next(recording)) + { + if(!base||(strstr(recording->Name(),base)==recording->Name()&&recording->Name()[strlen(base)]=='~')) + { + myMenuRecordingsItem *item=new myMenuRecordingsItem(recording,level); + if(!item->IsDirectory()&&*item->Text()&&(!lastitemtext||strcmp(lastitemtext,item->Text()))) + { + Add(item); + free(lastitemtext); + lastitemtext=strdup(item->Text()); + } + else + delete item; + } + } + free(lastitemtext); + Display(); +} + +void myMenuRecordings::SetHelpKeys() +{ + if(!HasSubMenu()) + { + myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current()); + int newhelpkeys=0; + if(item) + { + if(item->IsDirectory()) + newhelpkeys=1; + else + { + newhelpkeys=2; + } + if(newhelpkeys!=helpkeys) + { + switch(newhelpkeys) + { + case 0: SetHelp(NULL);break; + case 1: SetHelp(tr("Button$Open"));break; + case 2: + case 3: SetHelp(tr("Button$Play"),tr("Button$Rewind"),tr("Button$Edit"));break; + } + } + helpkeys=newhelpkeys; + } + } +} + +cRecording *myMenuRecordings::GetRecording(myMenuRecordingsItem *Item) +{ + cRecording *recording=Recordings.GetByName(Item->FileName()); + if(!recording) + Skins.Message(mtError,tr("Error while accessing recording!")); + return recording; +} + +bool myMenuRecordings::Open() +{ + myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current()); + if(item&&item->IsDirectory()) + { + const char *t=item->Name(); + char *buffer=NULL; + if(base) + { + asprintf(&buffer,"%s~%s",base,t); + t=buffer; + } + AddSubMenu(new myMenuRecordings(t,level+1)); + free(buffer); + return true; + } + return false; +} + +eOSState myMenuRecordings::Play() +{ + myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current()); + if(item) + { + if(item->IsDirectory()) + Open(); + else + { + cRecording *recording=GetRecording(item); + if(recording) + { + myReplayControl::SetRecording(recording->FileName(),recording->Title()); + cControl::Shutdown(); // stop running playbacks + cControl::Launch(new myReplayControl); // start playback + return osEnd; // close plugin + } + } + } + return osContinue; +} + +eOSState myMenuRecordings::Rewind() +{ + if(HasSubMenu()||Count()==0) + return osContinue; + + myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current()); + if(item&&!item->IsDirectory()) + { + cDevice::PrimaryDevice()->StopReplay(); + cResumeFile ResumeFile(item->FileName()); + ResumeFile.Delete(); + return Play(); + } + return osContinue; +} + +eOSState myMenuRecordings::Delete() +{ + if(HasSubMenu()||Count()==0) + return osContinue; + + myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current()); + if(item&&!item->IsDirectory()) + { + if(Interface->Confirm(tr("Delete recording?"))) + { + cRecordControl *rc=cRecordControls::GetRecordControl(item->FileName()); + if(rc) + { + if(Interface->Confirm(tr("Timer still recording - really delete?"))) + { + cTimer *timer=rc->Timer(); + if(timer) + { + timer->Skip(); + cRecordControls::Process(time(NULL)); + if(timer->IsSingleEvent()) + { + isyslog("deleting timer %s",*timer->ToDescr()); + Timers.Del(timer); + } + Timers.SetModified(); + } + } + else + return osContinue; + } + cRecording *recording=GetRecording(item); + if(recording) + { + if(recording->Delete()) + { + myReplayControl::ClearLastReplayed(item->FileName()); + Recordings.DelByName(item->FileName()); + cOsdMenu::Del(Current()); + SetHelpKeys(); + Display(); + if(!Count()) + return osBack; + } + else + Skins.Message(mtError,tr("Error while deleting recording!")); + } + } + } + return osContinue; +} + +eOSState myMenuRecordings::Rename() +{ + if(HasSubMenu()||Count()==0) + return osContinue; + + myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current()); + if(item&&!item->IsDirectory()) + { + cRecording *recording=GetRecording(item); + if(recording) + return AddSubMenu(new myMenuRenameRecording(recording,this)); + } + return osContinue; +} + +eOSState myMenuRecordings::MoveRec() +{ + if(HasSubMenu()||Count()==0) + return osContinue; + + myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current()); + if(item&&!item->IsDirectory()) + { + cRecording *recording=GetRecording(item); + if(recording) + { + clearall=false; + return AddSubMenu(new myMenuMoveRecording(recording,this)); + } + } + return osContinue; +} + +eOSState myMenuRecordings::ProcessKey(eKeys Key) +{ + eOSState state; + + if(edit) + { + switch(Key) + { + case kRed: edit=false; + helpkeys=-1; + return Rename(); + case kGreen: edit=false, + helpkeys=-1; + return MoveRec(); + case kYellow: edit=false; + helpkeys=-1; + return Delete(); + case kBack: edit=false; + helpkeys=-1; + SetHelpKeys(); + default: break; + } + state=osContinue; + } + else + { + bool hadsubmenu=HasSubMenu(); + state=cOsdMenu::ProcessKey(Key); + if(state==osUnknown) + { + switch(Key) + { + case kOk: + case kRed: return Play(); + case kGreen: return Rewind(); + case kYellow: { + myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current()); + if(item&&!item->IsDirectory()) + { + edit=true; + SetHelp(tr("Button$Rename"),tr("Button$Move"),tr("Button$Delete")); + } + break; + } + default: break; + } + } + + // refresh the list after submenu has closed + if(hadsubmenu&&!HasSubMenu()) + Set(); + + // go back if list is empty + if(!Count()) + state=osBack; + + if(!HasSubMenu()&&Key!=kNone); + SetHelpKeys(); + } + return state; +} |