summaryrefslogtreecommitdiff
path: root/mymenurecordings.c
diff options
context:
space:
mode:
authorMartin Prochnow <nordlicht@martins-kabuff.de>2006-03-12 18:14:36 +0100
committerAndreas Mair <andreas@vdr-developer.org>2006-03-12 18:14:36 +0100
commit17f89bafd559b28b5a175aa82730226dfe9f7d69 (patch)
tree7098824c14f462d44eaaccf5dc4c6975673ed275 /mymenurecordings.c
parentbabfdd26f9d2fbe164205951413d74aa6d21ef23 (diff)
downloadvdr-plugin-extrecmenu-17f89bafd559b28b5a175aa82730226dfe9f7d69.tar.gz
vdr-plugin-extrecmenu-17f89bafd559b28b5a175aa82730226dfe9f7d69.tar.bz2
Version 0.3v0.3
- details for directories are shown now (# of entries, # of new entries) - option to shown the length of a recording - option to hide recording date, time and/or length
Diffstat (limited to 'mymenurecordings.c')
-rw-r--r--mymenurecordings.c129
1 files changed, 97 insertions, 32 deletions
diff --git a/mymenurecordings.c b/mymenurecordings.c
index 3c5f76f..b29242e 100644
--- a/mymenurecordings.c
+++ b/mymenurecordings.c
@@ -1,8 +1,11 @@
#include "mymenurecordings.h"
+#include "mymenusetup.h"
// --- myMenuRecordingsItem ---------------------------------------------------
myMenuRecordingsItem::myMenuRecordingsItem(cRecording *Recording,int Level)
{
+ totalentries=newentries=0;
+
char isnew=Recording->IsNew()?'*':' ';
name=NULL;
filename=Recording->FileName();
@@ -17,7 +20,7 @@ myMenuRecordingsItem::myMenuRecordingsItem(cRecording *Recording,int Level)
}
// create the title of this item
- if(Level<level)
+ if(Level<level) // directory entries
{
s=Recording->Name();
while(Level)
@@ -25,30 +28,61 @@ myMenuRecordingsItem::myMenuRecordingsItem(cRecording *Recording,int Level)
s=strchr(Recording->Name(),'~')+1;
Level--;
}
- title=strdup(s);
+ asprintf(&title,"\t\t%s",s);
char *p=strchr(title,'~');
if(p)
*p=0;
- name=strdup(title);
+ name=strdup(title+2);
}
else
- if(Level==level)
+ if(Level==level) // recording entries
{
s=strrchr(Recording->Name(),'~');
- struct tm tm_tmp;
- localtime_r(&Recording->start,&tm_tmp);
- asprintf(&title,"%02d.%02d.%02d\t%02d:%02d%c\t%s",
- tm_tmp.tm_mday,
- tm_tmp.tm_mon+1,
- tm_tmp.tm_year%100,
- tm_tmp.tm_hour,
- tm_tmp.tm_min,
- isnew,
- s?s+1:Recording->Name());
+ // date and time of recording
+ struct tm t;
+ localtime_r(&Recording->start,&t);
+
+ // recording length
+ struct tIndex{int offset;uchar type;uchar number;short reserved;};
+ char RecLength[21],RecDate[9],RecTime[6],RecDelimiter[2]={'\t',0};
+ int last=-1;
+ char *indexfilename;
+
+ asprintf(&indexfilename,"%s/index.vdr",filename);
+ int delta=0;
+ if(!access(indexfilename,R_OK))
+ {
+ struct stat buf;
+ if(!stat(indexfilename,&buf))
+ {
+ delta=buf.st_size%sizeof(tIndex);
+ if(delta)
+ delta=sizeof(tIndex)-delta;
+ last=(buf.st_size+delta)/sizeof(tIndex)+1;
+ char hour[2],min[3];
+ snprintf(RecLength,sizeof(RecLength),"%s",*IndexToHMSF(last,true));
+ snprintf(hour,sizeof(hour),"%c",RecLength[0]);
+ snprintf(min,sizeof(min),"%c%c",RecLength[2],RecLength[3]);
+ snprintf(RecLength,sizeof(RecLength),"%d'",(atoi(hour)*60)+atoi(min));
+ }
+ }
+ free(indexfilename);
+
+ snprintf(RecDate,sizeof(RecDate),"%02d.%02d.%02d",t.tm_mday,t.tm_mon,t.tm_year%100);
+ snprintf(RecTime,sizeof(RecTime),"%02d:%02d",t.tm_hour,t.tm_min);
+ asprintf(&title,"%s%s%s%s%s%s%c%s",
+ (mysetup.ShowRecDate?RecDate:""),
+ (mysetup.ShowRecDate?RecDelimiter:""),
+ (mysetup.ShowRecTime?RecTime:""),
+ (mysetup.ShowRecTime?RecDelimiter:""),
+ (mysetup.ShowRecLength?RecLength:""),
+ (mysetup.ShowRecLength?RecDelimiter:""),
+ isnew,
+ s?s+1:Recording->Name());
}
else
- if(Level>level)
+ if(Level>level) // any other
{
title="";
}
@@ -62,16 +96,29 @@ myMenuRecordingsItem::~myMenuRecordingsItem()
free(name);
}
+void myMenuRecordingsItem::IncrementCounter(bool IsNew)
+{
+ totalentries++;
+ if(IsNew)
+ newentries++;
+
+ char *buffer=NULL;
+ asprintf(&buffer,"%d\t%d\t%s",totalentries,newentries,name);
+ SetText(buffer,false);
+}
+
// --- myMenuRecordings -------------------------------------------------------
-myMenuRecordings::myMenuRecordings(const char *Base,int Level):cOsdMenu(Base?Base:tr(DESCRIPTION),8,6)
+myMenuRecordings::myMenuRecordings(const char *Base,int Level):cOsdMenu(Base?Base:tr(DESCRIPTION),8,6,4)
{
edit=false;
level=Level;
helpkeys=-1;
base=Base?strdup(Base):NULL;
- Display();
+ Recordings.StateChanged(recordingsstate);
+
Set();
+ Display();
SetHelpKeys();
}
@@ -80,48 +127,61 @@ myMenuRecordings::~myMenuRecordings()
free(base);
}
-void myMenuRecordings::Set()
+void myMenuRecordings::Set(bool Refresh)
{
- char *lastitemtext=NULL;
-
cThreadLock RecordingsLock(&Recordings);
Clear();
Recordings.Sort();
+ char *lastitemtext=NULL;
+ myMenuRecordingsItem *lastitem=NULL;
// 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())))
+ if(*item->Text()&&(!lastitem||strcmp(item->Text(),lastitemtext)))
{
- Add(item);
+ if(item->IsDirectory())
+ Add(item);
+
+ lastitem=item;
free(lastitemtext);
- lastitemtext=strdup(item->Text());
+ lastitemtext=strdup(lastitem->Text());
}
else
delete item;
+
+ if(lastitem)
+ {
+ if(lastitem->IsDirectory())
+ lastitem->IncrementCounter(recording->IsNew()); // counts the number of entries in a directory
+ }
}
}
+ lastitem=NULL;
// 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())))
+ if(*item->Text()&&(!lastitem||strcmp(lastitemtext,item->Text())))
{
- Add(item);
+ if(!item->IsDirectory())
+ Add(item);
+ lastitem=item;
free(lastitemtext);
- lastitemtext=strdup(item->Text());
+ lastitemtext=strdup(lastitem->Text());
}
else
delete item;
}
}
free(lastitemtext);
- Display();
+ if(Refresh)
+ Display();
}
void myMenuRecordings::SetHelpKeys()
@@ -153,6 +213,7 @@ void myMenuRecordings::SetHelpKeys()
}
}
+// returns the corresponding recording to an item
cRecording *myMenuRecordings::GetRecording(myMenuRecordingsItem *Item)
{
cRecording *recording=Recordings.GetByName(Item->FileName());
@@ -161,6 +222,7 @@ cRecording *myMenuRecordings::GetRecording(myMenuRecordingsItem *Item)
return recording;
}
+// opens a subdirectory
bool myMenuRecordings::Open()
{
myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current());
@@ -180,6 +242,7 @@ bool myMenuRecordings::Open()
return false;
}
+// plays a recording
eOSState myMenuRecordings::Play()
{
myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current());
@@ -202,6 +265,7 @@ eOSState myMenuRecordings::Play()
return osContinue;
}
+// plays a recording from the beginning
eOSState myMenuRecordings::Rewind()
{
if(HasSubMenu()||Count()==0)
@@ -218,6 +282,7 @@ eOSState myMenuRecordings::Rewind()
return osContinue;
}
+// delete a recording
eOSState myMenuRecordings::Delete()
{
if(HasSubMenu()||Count()==0)
@@ -270,6 +335,7 @@ eOSState myMenuRecordings::Delete()
return osContinue;
}
+// renames a recording
eOSState myMenuRecordings::Rename()
{
if(HasSubMenu()||Count()==0)
@@ -285,6 +351,7 @@ eOSState myMenuRecordings::Rename()
return osContinue;
}
+// moves a recording
eOSState myMenuRecordings::MoveRec()
{
if(HasSubMenu()||Count()==0)
@@ -303,6 +370,7 @@ eOSState myMenuRecordings::MoveRec()
return osContinue;
}
+// opens an info screen to a recording
eOSState myMenuRecordings::Info(void)
{
if(HasSubMenu()||Count()==0)
@@ -344,7 +412,6 @@ eOSState myMenuRecordings::ProcessKey(eKeys Key)
}
else
{
- bool hadsubmenu=HasSubMenu();
state=cOsdMenu::ProcessKey(Key);
if(state==osUnknown)
{
@@ -363,13 +430,11 @@ eOSState myMenuRecordings::ProcessKey(eKeys Key)
break;
}
case kBlue: return Info();
+ case kNone: if(Recordings.StateChanged(recordingsstate))
+ Set(true);
default: break;
}
}
- // refresh the list after submenu has closed
- if(hadsubmenu&&!HasSubMenu())
- Set();
-
// go back if list is empty
if(!Count())
state=osBack;