summaryrefslogtreecommitdiff
path: root/menu_dirselect.c
diff options
context:
space:
mode:
Diffstat (limited to 'menu_dirselect.c')
-rw-r--r--menu_dirselect.c310
1 files changed, 146 insertions, 164 deletions
diff --git a/menu_dirselect.c b/menu_dirselect.c
index 4f9cfc4..89e22be 100644
--- a/menu_dirselect.c
+++ b/menu_dirselect.c
@@ -34,40 +34,42 @@ cConfDDirExts ConfDDirExts;
// --- cMenuDirItem ---------------------------------------------------------
class cMenuDirItem : public cOsdItem
{
- private:
+private:
char* directory;
- public:
- cMenuDirItem(const char* text) : cOsdItem(text) { directory = strdup(text);}
- ~cMenuDirItem(){ if (directory) free(directory);}
+public:
+ cMenuDirItem(const char* text) : cOsdItem(text) {
+ directory = strdup(text);
+ }
+ ~cMenuDirItem() {
+ if (directory) free(directory);
+ }
virtual int Compare(const cListObject &ListObject) const;
};
int cMenuDirItem::Compare(const cListObject &ListObject) const
{
const cMenuDirItem *p = (cMenuDirItem *)&ListObject;
- int hasVars1 = (strchr(directory,'%') != NULL?1:0);
- int hasVars2 = (strchr(p->directory,'%') != NULL?1:0);
- if (hasVars1 || hasVars2)
- {
- if (hasVars1 != hasVars2)
- return hasVars2-hasVars1;
- else
- return strcasecmp(directory, p->directory);
- }
- else
- return strcasecmp(directory, p->directory);
+ int hasVars1 = (strchr(directory, '%') != NULL ? 1 : 0);
+ int hasVars2 = (strchr(p->directory, '%') != NULL ? 1 : 0);
+ if (hasVars1 || hasVars2) {
+ if (hasVars1 != hasVars2)
+ return hasVars2 - hasVars1;
+ else
+ return strcasecmp(directory, p->directory);
+ } else
+ return strcasecmp(directory, p->directory);
}
// --- cMenuDirSelect ---------------------------------------------------------
cMenuDirSelect::cMenuDirSelect(char* szDirectory)
-:cOsdMenu(tr("Select directory"))
+ : cOsdMenu(tr("Select directory"))
{
- SetMenuCategory(mcTimerEdit);
+ SetMenuCategory(mcTimerEdit);
Directory = szDirectory;
- yellow=NULL;
+ yellow = NULL;
MaxLevel = 1;
CurLevel = 1;
Load();
@@ -82,19 +84,15 @@ int cMenuDirSelect::Level(const char* szDir)
{
int iLevel = 1;
if (strchr(szDir, '%')) // dirs with vars always have level 1
- return 1;
- do
- {
- const char* pos = strchr(szDir, '~');
- if (pos)
- {
- iLevel++;
- szDir = pos+1;
- }
- else
- return iLevel;
- }
- while(true);
+ return 1;
+ do {
+ const char* pos = strchr(szDir, '~');
+ if (pos) {
+ iLevel++;
+ szDir = pos + 1;
+ } else
+ return iLevel;
+ } while (true);
return 1;
}
@@ -104,23 +102,21 @@ void cMenuDirSelect::AddDistinct(const char* szText)
MaxLevel = std::max(MaxLevel, iLevel);
if (iLevel > CurLevel) // only show Items of the specified level, except those with vars
- return;
+ return;
- for(int i=0; i<Count(); i++)
- {
- const char* ItemText = Get(i)->Text();
- char* itemtext = strdup(ItemText);
- char* sztext = strdup(szText);
- ToLower(itemtext);
- ToLower(sztext);
- if (itemtext && strlen(itemtext) > 0 && strcmp(sztext, itemtext) == 0)
- {
- free(itemtext);
- free(sztext);
- return;
- }
- free(itemtext);
- free(sztext);
+ for (int i = 0; i < Count(); i++) {
+ const char* ItemText = Get(i)->Text();
+ char* itemtext = strdup(ItemText);
+ char* sztext = strdup(szText);
+ ToLower(itemtext);
+ ToLower(sztext);
+ if (itemtext && strlen(itemtext) > 0 && strcmp(sztext, itemtext) == 0) {
+ free(itemtext);
+ free(sztext);
+ return;
+ }
+ free(itemtext);
+ free(sztext);
}
Add(new cMenuDirItem(hk(szText)));
}
@@ -130,156 +126,142 @@ void cMenuDirSelect::CreateDirSet(bool extraDirs)
directorySet.clear();
// add distinct directories from current recordings
- {
- LOCK_RECORDINGS_READ;
- for (const cRecording *recording = Recordings->First(); recording; recording = Recordings->Next(recording))
{
- if (recording->HierarchyLevels() > 0)
- {
- char* dir = strdup(recording->Name());
- // strip the trailing rec dir
- char* pos = strrchr(dir, '~');
- if (pos)
- {
- *pos=0;
- for(int iLevel = 0; iLevel < recording->HierarchyLevels(); iLevel++)
- {
- directorySet.insert(dir);
- char* pos = strrchr(dir, '~');
- if (pos)
- *pos=0;
- }
- }
- free(dir);
- }
- }
- } // give up Recordings Lock
+ LOCK_RECORDINGS_READ;
+ for (const cRecording *recording = Recordings->First(); recording; recording = Recordings->Next(recording)) {
+ if (recording->HierarchyLevels() > 0) {
+ char* dir = strdup(recording->Name());
+ // strip the trailing rec dir
+ char* pos = strrchr(dir, '~');
+ if (pos) {
+ *pos = 0;
+ for (int iLevel = 0; iLevel < recording->HierarchyLevels(); iLevel++) {
+ directorySet.insert(dir);
+ char* pos = strrchr(dir, '~');
+ if (pos)
+ *pos = 0;
+ }
+ }
+ free(dir);
+ }
+ }
+ } // give up Recordings Lock
// add distinct directories from current timers
- {
- LOCK_TIMERS_READ;
- for (const cTimer *timer = Timers->First(); timer; timer = Timers->Next(timer))
{
- char* dir = strdup(timer->File());
- // strip the trailing name dir
- char* pos = strrchr(dir, '~');
- if (pos)
- {
- *pos=0;
- do
- {
- directorySet.insert(dir);
- char* pos = strrchr(dir, '~');
- if (pos)
- *pos=0;
- else break;
- }
- while(true);
- }
- free(dir);
+ LOCK_TIMERS_READ;
+ for (const cTimer *timer = Timers->First(); timer; timer = Timers->Next(timer)) {
+ char* dir = strdup(timer->File());
+ // strip the trailing name dir
+ char* pos = strrchr(dir, '~');
+ if (pos) {
+ *pos = 0;
+ do {
+ directorySet.insert(dir);
+ char* pos = strrchr(dir, '~');
+ if (pos)
+ *pos = 0;
+ else break;
+ } while (true);
+ }
+ free(dir);
+ }
}
- }
// add distinct directories from folders.conf
- for(cNestedItem* item = Folders.First(); item; item = Folders.Next(item))
- AddVDRFolders(item);
+ for (cNestedItem* item = Folders.First(); item; item = Folders.Next(item))
+ AddVDRFolders(item);
- if (extraDirs)
- {
- cMutexLock SearchExtsLock(&SearchExts);
- cSearchExt *searchExt = SearchExts.First();
- // add distinct directories from existing search timers
- while (searchExt)
- {
- if (strlen(searchExt->directory) > 0)
- directorySet.insert(searchExt->directory);
- searchExt = SearchExts.Next(searchExt);
- }
- // add distinct directories from epgsearchdirs.conf
- DirExts.Load(AddDirectory(CONFIGDIR, "epgsearchdirs.conf"), true);
- cDirExt* DirExt = DirExts.First();
- while (DirExt)
- {
- directorySet.insert(DirExt->Name());
- DirExt = DirExts.Next(DirExt);
- }
- // add distinct directories from conf.d files
- DirExt = ConfDDirExts.First();
- while (DirExt)
- {
- directorySet.insert(DirExt->Name());
- DirExt = ConfDDirExts.Next(DirExt);
- }
- }
+ if (extraDirs) {
+ cMutexLock SearchExtsLock(&SearchExts);
+ cSearchExt *searchExt = SearchExts.First();
+ // add distinct directories from existing search timers
+ while (searchExt) {
+ if (strlen(searchExt->directory) > 0)
+ directorySet.insert(searchExt->directory);
+ searchExt = SearchExts.Next(searchExt);
+ }
+ // add distinct directories from epgsearchdirs.conf
+ DirExts.Load(AddDirectory(CONFIGDIR, "epgsearchdirs.conf"), true);
+ cDirExt* DirExt = DirExts.First();
+ while (DirExt) {
+ directorySet.insert(DirExt->Name());
+ DirExt = DirExts.Next(DirExt);
+ }
+ // add distinct directories from conf.d files
+ DirExt = ConfDDirExts.First();
+ while (DirExt) {
+ directorySet.insert(DirExt->Name());
+ DirExt = ConfDDirExts.Next(DirExt);
+ }
+ }
}
void cMenuDirSelect::AddVDRFolders(cNestedItem* folder, string parentDirectory)
{
- if (folder == NULL) return;
- string folderDirectory = string((parentDirectory.size() == 0)?"":parentDirectory + "~") + folder->Text();
- directorySet.insert(folderDirectory);
- if (folder->SubItems() == NULL) return;
- for(cNestedItem* subfolder = folder->SubItems()->First(); subfolder; subfolder = folder->SubItems()->Next(subfolder))
- AddVDRFolders(subfolder, folderDirectory);
+ if (folder == NULL) return;
+ string folderDirectory = string((parentDirectory.size() == 0) ? "" : parentDirectory + "~") + folder->Text();
+ directorySet.insert(folderDirectory);
+ if (folder->SubItems() == NULL) return;
+ for (cNestedItem* subfolder = folder->SubItems()->First(); subfolder; subfolder = folder->SubItems()->Next(subfolder))
+ AddVDRFolders(subfolder, folderDirectory);
}
void cMenuDirSelect::Load()
{
int current = Current();
char* oldSelection = NULL; // save old selection for reselection
- if (current>-1)
- oldSelection = strdup(Get(current)->Text());
+ if (current > -1)
+ oldSelection = strdup(Get(current)->Text());
Clear();
CreateDirSet();
std::set<string>::iterator it;
for (it = directorySet.begin(); it != directorySet.end(); ++it)
- AddDistinct((*it).c_str());
+ AddDistinct((*it).c_str());
Sort();
- for(int i=0; i<Count(); i++)
- {
- const char* text = Get(i)->Text();
- if (oldSelection && strchr(text, '%') == NULL && strstr(text, oldSelection) == text) // skip entries with variables
- {
- SetCurrent(Get(i));
- break;
- }
+ for (int i = 0; i < Count(); i++) {
+ const char* text = Get(i)->Text();
+ if (oldSelection && strchr(text, '%') == NULL && strstr(text, oldSelection) == text) { // skip entries with variables
+ SetCurrent(Get(i));
+ break;
+ }
}
if (oldSelection) free(oldSelection);
- if (yellow)
- {
- free(yellow);
- yellow = NULL;
+ if (yellow) {
+ free(yellow);
+ yellow = NULL;
}
- msprintf(&yellow, "%s %d", tr("Button$Level"), (CurLevel==MaxLevel?1:CurLevel+1));
- SetHelp(NULL, NULL, MaxLevel==1?NULL:yellow, tr("Button$Select"));
+ msprintf(&yellow, "%s %d", tr("Button$Level"), (CurLevel == MaxLevel ? 1 : CurLevel + 1));
+ SetHelp(NULL, NULL, MaxLevel == 1 ? NULL : yellow, tr("Button$Select"));
Display();
}
eOSState cMenuDirSelect::ProcessKey(eKeys Key)
{
- eOSState state = cOsdMenu::ProcessKey(Key);
+ eOSState state = cOsdMenu::ProcessKey(Key);
- if (state == osUnknown) {
- switch ((int)Key) {
- case kBlue|k_Repeat:
- case kYellow:
- if (++CurLevel>MaxLevel)
- CurLevel=1;
- Load();
- return osContinue;
- case kGreen:
- case kRed:
- return osContinue;
- case kBlue:
- case kOk:
- if (Count() > 0)
- strn0cpy(Directory,Get(Current())->Text(), MaxFileName);
- return osBack;
- default: break;
- }
- }
- return state;
+ if (state == osUnknown) {
+ switch ((int)Key) {
+ case kBlue|k_Repeat:
+ case kYellow:
+ if (++CurLevel > MaxLevel)
+ CurLevel = 1;
+ Load();
+ return osContinue;
+ case kGreen:
+ case kRed:
+ return osContinue;
+ case kBlue:
+ case kOk:
+ if (Count() > 0)
+ strn0cpy(Directory, Get(Current())->Text(), MaxFileName);
+ return osBack;
+ default:
+ break;
+ }
+ }
+ return state;
}