summaryrefslogtreecommitdiff
path: root/mymenueditrecording.c
diff options
context:
space:
mode:
authorMartin Prochnow <nordlicht@martins-kabuff.de>2006-04-17 17:00:18 +0200
committerAndreas Mair <andreas@vdr-developer.org>2006-04-17 17:00:18 +0200
commit3c04e4ce347dff915def3a79f348f2f46e60564d (patch)
tree51defa818f251ce9d70472ad202b85165c6837fc /mymenueditrecording.c
parent82bfd4c15949019ede37b2b04be79659c5c65dbe (diff)
downloadvdr-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.c369
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;
+}