diff options
author | Martin Prochnow <nordlicht@martins-kabuff.de> | 2006-04-17 17:00:18 +0200 |
---|---|---|
committer | Andreas Mair <andreas@vdr-developer.org> | 2006-04-17 17:00:18 +0200 |
commit | 3c04e4ce347dff915def3a79f348f2f46e60564d (patch) | |
tree | 51defa818f251ce9d70472ad202b85165c6837fc /mymenueditrecording.c | |
parent | 82bfd4c15949019ede37b2b04be79659c5c65dbe (diff) | |
download | vdr-plugin-extrecmenu-3c04e4ce347dff915def3a79f348f2f46e60564d.tar.gz vdr-plugin-extrecmenu-3c04e4ce347dff915def3a79f348f2f46e60564d.tar.bz2 |
Version 0.9av0.9a
- fixed #ifdef's for JumpPlay-patch in myreplaycontrol.c; thanks to Thomas Günther for reporting
- include fixed 'dvdarchive.sh', umount wasn't possible; thanks to Mase from vdr-portal.de for reporting
- added support for CmdSubMenu-patch, it should now be possible to use sub menus if you patched your VDR with BigPatch or CmdSubMenu-patch
Diffstat (limited to 'mymenueditrecording.c')
-rw-r--r-- | mymenueditrecording.c | 369 |
1 files changed, 369 insertions, 0 deletions
diff --git a/mymenueditrecording.c b/mymenueditrecording.c new file mode 100644 index 0000000..ccd24be --- /dev/null +++ b/mymenueditrecording.c @@ -0,0 +1,369 @@ +/* + * See the README file for copyright information and how to reach the author. + * + */ + +#include <vdr/videodir.h> +#include <vdr/remote.h> +#include <vdr/menu.h> +#include "mymenurecordings.h" +#include "tools.h" + +bool clearall; +char newname[128]; + +// --- myMenuRenameRecording -------------------------------------------------- +myMenuRenameRecording::myMenuRenameRecording(cRecording *Recording,myMenuRecordings *MenuRecordings):cOsdMenu(tr("Rename recording"),12) +{ + recording=Recording; + menurecordings=MenuRecordings; + + char *p=strrchr(recording->Name(),'~'); + if(p) + { + strn0cpy(name,++p,sizeof(name)); + strn0cpy(path,recording->Name(),sizeof(path)); + + p=strrchr(path,'~'); + if(p) + *p=0; + } + else + { + strn0cpy(name,recording->Name(),sizeof(name)); + strn0cpy(path,"",sizeof(path)); + } + Add(new cMenuEditStrItem(tr("Name"),name,sizeof(name),tr(FileNameChars))); + cRemote::Put(kRight); +} + +eOSState myMenuRenameRecording::ProcessKey(eKeys Key) +{ + eOSState state=cOsdMenu::ProcessKey(Key); + if(state==osContinue) + { + if(Key==kOk) + { + char *buffer; + char *newfilename; + + if(strlen(path)) + asprintf(&buffer,"%s~%s",path,name); + else + asprintf(&buffer,"%s",name); + + asprintf(&newfilename,"%s/%s/%s",VideoDirectory,ExchangeChars(buffer,true),strrchr(recording->FileName(),'/')+1); + + if(MoveVideoFile(recording,newfilename)) + { + menurecordings->Set(true); + state=osBack; + } + else + { + Skins.Message(mtError,tr("Error while accessing recording!")); + state=osContinue; + } + free(buffer); + free(newfilename); + } + if(Key==kBack) + return osBack; + } + return state; +} + +// --- myMenuMoveRecordings --------------------------------------------------- +// --- myMenuNewName ---------------------------------------------------------- +class myMenuNewName:public cOsdMenu +{ + private: + char name[128]; + public: + myMenuNewName(); + virtual eOSState ProcessKey(eKeys Key); +}; + +myMenuNewName::myMenuNewName():cOsdMenu(tr("New folder"),12) +{ + strn0cpy(name,tr("New folder"),sizeof(name)); + Add(new cMenuEditStrItem(tr("Name"),name,sizeof(name),tr(FileNameChars))); + cRemote::Put(kRight); +} + +eOSState myMenuNewName::ProcessKey(eKeys Key) +{ + eOSState state=cOsdMenu::ProcessKey(Key); + + if(state==osContinue) + { + if(Key==kOk) + { + strn0cpy(newname,name,sizeof(newname)); + state=osBack; + } + if(Key==kBack) + state=osBack; + } + + return state; +} + +// --- myMenuMoveRecordingItem ------------------------------------------------ +class myMenuMoveRecordingItem:public cOsdItem +{ + private: + int level; + char *title; + public: + myMenuMoveRecordingItem(const char *Title,int Level); + myMenuMoveRecordingItem(cRecording *Recording,int Level); + int Level(){return level;} + void SetLevel(int Level){level=Level;} +}; + +myMenuMoveRecordingItem::myMenuMoveRecordingItem(const char *Title,int Level) +{ + level=Level; + title=strdup(Title); + SetText(title); +} + +myMenuMoveRecordingItem::myMenuMoveRecordingItem(cRecording *Recording,int Level) +{ + level=0; + + const char *s=Recording->Name(); + while(*++s) + { + if(*s=='~') + level++; + } + if(Level<level) + { + s=Recording->Name(); + const char *p=s; + while(*++s) + { + if(*s == '~') + { + if(Level--) + p=s+1; + else + break; + } + } + title=MALLOC(char,s-p+1); + strn0cpy(title,p,s-p+1); + SetText(title); + } + else + SetText(""); +} + +// --- myMenuMoveRecording ---------------------------------------------------- +myMenuMoveRecording::myMenuMoveRecording(cRecording *Recording,myMenuRecordings *MenuRecordings,const char *Base,int Level):cOsdMenu(Base?Base:"") +{ + strn0cpy(newname,"",sizeof(newname)); + recording=Recording; + menurecordings=MenuRecordings; + base=Base?strdup(Base):NULL; + level=Level; + Set(); + SetHelp(tr("Button$Cancel"),NULL,tr("Button$Create"),tr("Button$Move")); +} + +myMenuMoveRecording::~myMenuMoveRecording() +{ + free(base); +} + +void myMenuMoveRecording::Set() +{ + if(level==0) + Add(new myMenuMoveRecordingItem(tr("[base dir]"),0)); + + char *lastitemtext=NULL; + myMenuMoveRecordingItem *lastitem=NULL; + for(cRecording *recording=Recordings.First();recording;recording=Recordings.Next(recording)) + { + if(!base||(strstr(recording->Name(),base)==recording->Name()&&recording->Name()[strlen(base)]=='~')) + { + myMenuMoveRecordingItem *item=new myMenuMoveRecordingItem(recording,level); + if(*item->Text()) + { + if(lastitemtext&&!strcmp(lastitemtext,item->Text())) // same text + { + if(lastitem&&lastitem->Level()<item->Level()) // if level of the previous item is lower, set it to the new value + { + lastitem->SetLevel(item->Level()); + } + delete item; + } + else + { + Add(item); // different text means a new item to add + lastitem=item; + free(lastitemtext); + lastitemtext=strdup(lastitem->Text()); + } + } + else + delete item; + } + } + free(lastitemtext); +} + +eOSState myMenuMoveRecording::Open() +{ + myMenuMoveRecordingItem *item=(myMenuMoveRecordingItem*)Get(Current()); + if(item) + { + if(item->Level()>level) + { + const char *t=item->Text(); + char buffer[MaxFileName]; + if(base) + { + snprintf(buffer,sizeof(buffer),"%s~%s",base,t); + t=buffer; + } + return AddSubMenu(new myMenuMoveRecording(recording,menurecordings,t,level+1)); + } + } + return osContinue; +} + +eOSState myMenuMoveRecording::MoveRec() +{ + char *dir=NULL,*p=NULL,*name,*newfilename; + eOSState state=osContinue; + + myMenuMoveRecordingItem *item=(myMenuMoveRecordingItem*)Get(Current()); + if(item) + { + + if(!strcmp(tr("[base dir]"),item->Text())) + dir=""; + else + asprintf(&dir,"%s~",item->Text()); + + p=strrchr(recording->Name(),'~'); + if(p) + { + if(base) + asprintf(&name,"%s~%s%s",base,dir,++p); + else + asprintf(&name,"%s%s",dir,++p); + } + else + { + if(base) + asprintf(&name,"%s~%s%s",base,dir,recording->Name()); + else + asprintf(&name,"%s%s",dir,recording->Name()); + } + + asprintf(&newfilename,"%s/%s/%s",VideoDirectory,ExchangeChars(name,true),strrchr(recording->FileName(),'/')+1); + } + else + { + p=strrchr(recording->Name(),'~'); + if(p) + asprintf(&name,"%s~%s",base,++p); + else + asprintf(&name,"%s~%s",base,recording->Name()); + + asprintf(&newfilename,"%s/%s/%s",VideoDirectory,ExchangeChars(name,true),strrchr(recording->FileName(),'/')+1); + } + + if(MoveVideoFile(recording,newfilename)) + { + menurecordings->Set(true); + clearall=true; // close move recording menu + state=osBack; + } + else + Skins.Message(mtError,tr("Error while accessing recording!")); + + if(dir!="") + free(dir); + free(name); + free(newfilename); + return state; +} + +eOSState myMenuMoveRecording::Create() +{ + return AddSubMenu(new myMenuNewName); +} + +eOSState myMenuMoveRecording::ProcessKey(eKeys Key) +{ + eOSState state=cOsdMenu::ProcessKey(Key); + + if(state==osUnknown) + { + switch(Key) + { + case kRed: clearall=true;break; + case kYellow: return Create(); + case kBlue: return MoveRec(); + case kOk: return Open(); + default: break; + } + } + + if(newname[0]!=0) + { + Add(new myMenuMoveRecordingItem(newname,level+2)); + Display(); + strn0cpy(newname,"",sizeof(newname)); + } + + if(clearall) + return osBack; + + return state; +} + +// --- myMenuRecordingDetails ------------------------------------------------- +myMenuRecordingDetails::myMenuRecordingDetails(cRecording *Recording,myMenuRecordings *MenuRecordings):cOsdMenu(tr("Details"),12) +{ + recording=Recording; + menurecordings=MenuRecordings; + priority=recording->priority; + lifetime=recording->lifetime; + + Add(new cMenuEditIntItem(tr("Priority"),&priority,0,MAXPRIORITY)); + Add(new cMenuEditIntItem(tr("Lifetime"),&lifetime,0,MAXLIFETIME)); +} + +eOSState myMenuRecordingDetails::ProcessKey(eKeys Key) +{ + eOSState state=cOsdMenu::ProcessKey(Key); + if(state==osUnknown) + { + if(Key==kOk) + { + char *newfilename=strdup(recording->FileName()); + + sprintf(newfilename+strlen(newfilename)-9,"%02d.%02d.rec",priority,lifetime); + + if(MoveVideoFile(recording,newfilename)) + { + menurecordings->Set(true); + state=osBack; + } + else + { + Skins.Message(mtError,tr("Error while accessing recording!")); + state=osContinue; + } + + free(newfilename); + } + } + return state; +} |