diff options
-rw-r--r-- | HISTORY | 1 | ||||
-rw-r--r-- | mymenurecordings.c | 75 | ||||
-rw-r--r-- | mymenurecordings.h | 2 | ||||
-rw-r--r-- | tools.c | 55 | ||||
-rw-r--r-- | tools.h | 3 |
5 files changed, 73 insertions, 63 deletions
@@ -2,6 +2,7 @@ VDR Plugin 'extrecmenu' Revision History ---------------------------------------- 2012-xx-xx: Version 1.2.3 +- [amair] Fix recording list problems with some recording names. - [amair] Set menu category in VDR >= 1.7.28 (Closes #1110). - [amair] Close replay OSD before starting cutter so that marks are saved to disk (submitted by mini73 @vdr-portal.de). - [amair] Always use VDR's cutting feature in VDR >=1.7.32. diff --git a/mymenurecordings.c b/mymenurecordings.c index ef1dda5..99e735f 100644 --- a/mymenurecordings.c +++ b/mymenurecordings.c @@ -201,8 +201,6 @@ myMenuRecordingsItem::myMenuRecordingsItem(cRecording *Recording,int Level) title=MALLOC(char,s-p+1); strn0cpy(title,p,s-p+1); name=strdup(title); - - uniqid=name; } else { @@ -221,13 +219,6 @@ myMenuRecordingsItem::myMenuRecordingsItem(cRecording *Recording,int Level) #endif struct tm *t=localtime_r(&start,&tm_r); - const char *c = strrchr(filename, '/'); - if (c) - idbuffer << (c + 1); - else - idbuffer << filename; - - // display symbol buffer=filename; if (isPesRecording) @@ -441,16 +432,13 @@ myMenuRecordingsItem::myMenuRecordingsItem(cRecording *Recording,int Level) if(i!=string::npos) { titlebuffer << _s.substr(i+1,_s.length()-i); - idbuffer << _s.substr(i+1,_s.length()-i); } else { titlebuffer << _s; - idbuffer << _s; } title=strdup(titlebuffer.str().c_str()); - uniqid=idbuffer.str(); } else { @@ -512,7 +500,6 @@ void myMenuRecordingsItem::SetMenuItem(cSkinDisplayMenu *displaymenu,int index,b // --- myMenuRecordings ------------------------------------------------------- #define MB_PER_MINUTE 25.75 // this is just an estimate! (taken over from VDR) -bool myMenuRecordings::golastreplayed=false; bool myMenuRecordings::wasdvd; bool myMenuRecordings::washdd; dev_t myMenuRecordings::fsid=0; @@ -598,7 +585,7 @@ myMenuRecordings::myMenuRecordings(const char *Base,int Level):cOsdMenu("") Set(); - if(myReplayControl::LastReplayed()) + if(mysetup.GoLastReplayed && myReplayControl::LastReplayed()) Open(); Display(); @@ -772,12 +759,12 @@ void myMenuRecordings::SetHelpKeys() } // create the menu list -void myMenuRecordings::Set(bool Refresh,char *_current) +void myMenuRecordings::Set(bool Refresh) { - const char *lastreplayed=_current?_current:myReplayControl::LastReplayed(); + const char *lastreplayed=myReplayControl::LastReplayed(); cThreadLock RecordingsLock(&Recordings); - if(Refresh && !_current) + if(Refresh) { fsid=0; myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current()); @@ -809,7 +796,6 @@ void myMenuRecordings::Set(bool Refresh,char *_current) hidepinprotectedrecs=pinplugin->SetupParse("hideProtectedRecordings","1"); #endif - char *lastitemtext=NULL; myMenuRecordingsItem *lastitem=NULL; for(myRecListItem *listitem=list->First();listitem;listitem=list->Next(listitem)) { @@ -817,47 +803,59 @@ void myMenuRecordings::Set(bool Refresh,char *_current) if(!base||(strstr(recording->Name(),base)==recording->Name()&&recording->Name()[strlen(base)]=='~')) { myMenuRecordingsItem *recitem=new myMenuRecordingsItem(recording,level); - if(*recitem->UniqID() && (!lastitem || strcmp(recitem->UniqID(),lastitemtext))) + myMenuRecordingsItem *lastdir=NULL; + if(recitem->IsDirectory()) + { + // Sorting may ignore non-alphanumeric characters, so we need to explicitly handle directories in case they only differ in such characters: + for(myMenuRecordingsItem *p=lastitem;p;p=dynamic_cast<myMenuRecordingsItem *>(p->Prev())) + { + if(p->Name()&&strcmp(p->Name(),recitem->Name())==0) + { + lastdir=p; + break; + } + } + } + if(*recitem->Text()&&!lastdir) { #ifdef USE_PINPLUGIN if(!(hidepinprotectedrecs && cStatus::MsgReplayProtected(recording,recitem->Name(),base,recitem->IsDirectory(),true))) - { + { #endif Add(recitem); lastitem=recitem; - free(lastitemtext); - lastitemtext=strdup(lastitem->UniqID()); + if(recitem->IsDirectory()) + lastdir=recitem; #ifdef USE_PINPLUGIN - } - else - lastitem=NULL; + } + else + lastitem=NULL; #endif } else delete recitem; - if(lastitem) + if(lastitem||lastdir) { - if(!MoveCutterThread->IsMoving(recording->FileName())) - lastitem->SetDirIsMoving(false); + if(lastitem) + { + if(!MoveCutterThread->IsMoving(recording->FileName())) + lastitem->SetDirIsMoving(false); + } - if(lastitem->IsDirectory()) - lastitem->IncrementCounter(recording->IsNew()); - if(lastreplayed && !strcmp(lastreplayed,recording->FileName())) + if(lastreplayed&&strcmp(lastreplayed,recording->FileName())==0) { - if(golastreplayed||Refresh) - { - SetCurrent(lastitem); - if(recitem && !recitem->IsDirectory() && !cControl::Control() && !mysetup.GoLastReplayed) - golastreplayed=false; - } + SetCurrent(lastdir?lastdir:lastitem); if(recitem&&!recitem->IsDirectory()&&(recitem->IsDVD()||recitem->IsHDD())&&!cControl::Control()) cReplayControl::ClearLastReplayed(cReplayControl::LastReplayed()); } + + if(lastdir){ + lastdir->IncrementCounter(recording->IsNew()); + } } } } - free(lastitemtext); delete list; ForceFreeMbUpdate(); @@ -1080,7 +1078,6 @@ eOSState myMenuRecordings::Play() } buffer=NULL; } - golastreplayed=true; #if VDRVERSNUM >= 10728 myReplayControl::SetRecording(recording->FileName()); #else diff --git a/mymenurecordings.h b/mymenurecordings.h index 2000e44..e05046c 100644 --- a/mymenurecordings.h +++ b/mymenurecordings.h @@ -67,7 +67,7 @@ class myMenuRecordings:public cOsdMenu public: myMenuRecordings(const char *Base=NULL,int Level=0); ~myMenuRecordings(); - void Set(bool Refresh=false,char *current=NULL); + void Set(bool Refresh=false); virtual eOSState ProcessKey(eKeys Key); #ifdef USE_GRAPHTFT virtual const char* MenuKind(){return"MenuExtRecordings";} @@ -195,10 +195,13 @@ myRecListItem::myRecListItem(cRecording *Recording) { recording=Recording; filename=strdup(recording->FileName()); + sortBufferName = sortBufferTime = NULL; } myRecListItem::~myRecListItem() { + free(sortBufferName); + free(sortBufferTime); free(filename); } @@ -220,39 +223,45 @@ char *myRecListItem::StripEpisodeName(char *s) } t++; } - if(mysetup.DescendSorting) + if(s1&&s2) { - if(SortByName) - *s1=1; - else - *(s2+1)=(char)255; + // To have folders sorted before plain recordings, the '/' s1 points to + // is replaced by the character '1'. All other slashes will be replaced + // by '0' in SortName() (see below), which will result in the desired + // sequence: + *s1='1'; + if(!SortByName) + { + s1++; + memmove(s1,s2,t-s2+1); + } } - else - *s1=(char)255; - - if(s1 && s2 && !SortByName) - memmove(s1+1,s2,t-s2+1); - return s; } -int myRecListItem::Compare(const cListObject &ListObject)const +char *myRecListItem::SortName(void) const { - myRecListItem *item=(myRecListItem*)&ListObject; + char **sb=SortByName?&sortBufferName:&sortBufferTime; + if(!*sb) + { + char *s=StripEpisodeName(strdup(recording->FileName()+strlen(VideoDirectory))); + strreplace(s,'/','0'); // some locales ignore '/' when sorting + int l=strxfrm(NULL,s,0)+1; + *sb=MALLOC(char,l); + strxfrm(*sb,s,l); + free(s); + } + return *sb; +} - char *s1=StripEpisodeName(strdup(filename+strlen(VideoDirectory))); - char *s2=StripEpisodeName(strdup(item->filename+strlen(VideoDirectory))); +int myRecListItem::Compare(const cListObject &ListObject)const +{ + myRecListItem *r=(myRecListItem*)&ListObject; - int compare; if(mysetup.DescendSorting) - compare=strcasecmp(s2,s1); + return strcasecmp(r->SortName(),SortName()); else - compare=strcasecmp(s1,s2); - - free(s1); - free(s2); - - return compare; + return strcasecmp(SortName(),r->SortName()); } // --- myRecList -------------------------------------------------------------- @@ -33,7 +33,10 @@ class myRecListItem:public cListObject private: static bool SortByName; char *filename; + mutable char *sortBufferName; + mutable char *sortBufferTime; static char *StripEpisodeName(char *s); + char *SortName(void) const; public: myRecListItem(cRecording *Recording); ~myRecListItem(); |