summaryrefslogtreecommitdiff
path: root/mymenumoverecording.c
diff options
context:
space:
mode:
authorMartin Prochnow <nordlicht@martins-kabuff.de>2006-03-09 15:01:38 +0100
committerAndreas Mair <andreas@vdr-developer.org>2006-03-09 15:01:38 +0100
commit93372f4ecc69a079c0e5c5af9169f39222983667 (patch)
treef341ea604e6fd1a8e175ee78a70cab88a6006623 /mymenumoverecording.c
downloadvdr-plugin-extrecmenu-93372f4ecc69a079c0e5c5af9169f39222983667.tar.gz
vdr-plugin-extrecmenu-93372f4ecc69a079c0e5c5af9169f39222983667.tar.bz2
Version 0.1 (Initial revision).v0.1
Diffstat (limited to 'mymenumoverecording.c')
-rw-r--r--mymenumoverecording.c218
1 files changed, 218 insertions, 0 deletions
diff --git a/mymenumoverecording.c b/mymenumoverecording.c
new file mode 100644
index 0000000..f0a64d1
--- /dev/null
+++ b/mymenumoverecording.c
@@ -0,0 +1,218 @@
+#include "extrecmenu.h"
+
+bool clearall;
+char newname[128];
+
+// --- 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)));
+}
+
+eOSState myMenuNewName::ProcessKey(eKeys Key)
+{
+ eOSState state=cOsdMenu::ProcessKey(Key);
+
+ if(state==osUnknown)
+ {
+ if(Key==kOk)
+ {
+ strn0cpy(newname,name,sizeof(newname));
+ state=osBack;
+ }
+ }
+
+ return state;
+}
+
+// --- myMenuMoveRecordingItem ------------------------------------------------
+class myMenuMoveRecordingItem:public cOsdItem
+{
+ private:
+ int level;
+ char *title;
+ public:
+ myMenuMoveRecordingItem(cRecording *Recording,int Level);
+};
+
+myMenuMoveRecordingItem::myMenuMoveRecordingItem(cRecording *Recording,int Level)
+{
+ level=0;
+ const char *s=Recording->Name();
+ while(*++s)
+ {
+ if(*s=='~')
+ level++;
+ }
+
+ 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;
+ 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$Select"));
+}
+
+myMenuMoveRecording::~myMenuMoveRecording()
+{
+ free(base);
+}
+
+void myMenuMoveRecording::Set()
+{
+ char *lastitemtext=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()&&(!lastitemtext||strcmp(lastitemtext,item->Text())))
+ {
+ Add(item);
+ free(lastitemtext);
+ lastitemtext=strdup(item->Text());
+ }
+ else
+ delete item;
+ }
+ }
+ free(lastitemtext);
+}
+
+eOSState myMenuMoveRecording::Open()
+{
+ if(newname[0]!=0)
+ {
+ const char *t;
+ char buffer[MaxFileName];
+ if(base)
+ snprintf(buffer,sizeof(buffer),"%s~%s",base,newname);
+ else
+ snprintf(buffer,sizeof(buffer),"%s",newname);
+ t=buffer;
+ return AddSubMenu(new myMenuMoveRecording(recording,menurecordings,t,level+1));
+ }
+ else
+ {
+ myMenuMoveRecordingItem *item=(myMenuMoveRecordingItem*)Get(Current());
+ if(item)
+ {
+ 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 *name;
+
+ char *p=strrchr(recording->Name(),'~');
+ if(p)
+ {
+ if(base)
+ asprintf(&name,"%s~%s",base,++p);
+ else
+ asprintf(&name,"%s",++p);
+ }
+ else
+ {
+ if(base)
+ asprintf(&name,"%s~%s",base,recording->Name());
+ else
+ asprintf(&name,"%s",recording->Name());
+ }
+
+ char *newfilename;
+ asprintf(&newfilename,"%s/%s/%s",VideoDirectory,ExchangeChars(name,true),strrchr(recording->FileName(),'/')+1);
+
+ int result=MakeDirs(newfilename,true);
+ if(result)
+ {
+ result=RenameVideoFile(recording->FileName(),newfilename);
+ if(result)
+ {
+ // update recordings list
+ Recordings.Update(true);
+ // update menu
+ menurecordings->Set();
+ // close move-recordings-menu
+ clearall=true;
+ }
+ else
+ Skins.Message(mtError,tr("Error while accessing recording!"));
+ }
+ else
+ Skins.Message(mtError,tr("Error while accessing recording!"));
+
+ return osContinue;
+}
+
+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)
+ return Open();
+
+ if(clearall)
+ return osBack;
+
+ return state;
+}