summaryrefslogtreecommitdiff
path: root/menuplaylist.c
diff options
context:
space:
mode:
authorMartin Dummer <martin.dummer@gmx.net>2012-07-01 20:15:45 +0200
committerMartin Dummer <martin.dummer@gmx.net>2012-07-01 20:15:45 +0200
commit28498899a405329e3c8c8fc9af5d573d1d2f923e (patch)
treef7736f603c1a8281353dec79e77a269dc207eb4b /menuplaylist.c
downloadvdr-plugin-playlist-0.0.2rc3.tar.gz
vdr-plugin-playlist-0.0.2rc3.tar.bz2
Initial import of version 0.0.2rc3v0.0.2rc3
Diffstat (limited to 'menuplaylist.c')
-rw-r--r--menuplaylist.c966
1 files changed, 966 insertions, 0 deletions
diff --git a/menuplaylist.c b/menuplaylist.c
new file mode 100644
index 0000000..e87588d
--- /dev/null
+++ b/menuplaylist.c
@@ -0,0 +1,966 @@
+/*
+ * playlist: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id: menuplaylist.c 0.2 2004/10/08 02:34:00 hflor Exp $
+ */
+
+#include "menuplaylist.h"
+#include "dataplaylist.h"
+#if VDRVERSNUM < 10307
+#include "menuitemtext.h"
+#endif
+#include "playlist.h"
+#include "i18n.h"
+#include "vdrtools.h"
+#include <vdr/interface.h>
+#include <vdr/videodir.h>
+#ifdef HAVE_ICONPATCH
+#include <vdr/iconpatch.h>
+#endif
+
+// --- cMenuRecordingSelectItem --------------------------------------------------------
+
+cMenuRecordingSelectItem::cMenuRecordingSelectItem(cRecording *Recording, int Level)
+{
+ filename = strdup(Recording->FileName());
+ totalEntries = newEntries = 0;
+ start = Recording->start;
+ SetText(Recording->Title('\t', true, Level));
+ if ((isdir = (*Text() == '\t')))
+ name = strdup(Text() + 2);
+ else
+ name = strdup(Recording->Name());
+ ismark = false;
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuRecordingSelectItem::cMenuRecordingSelectItem FileName=%s Level=%d Name=%s", plugin_name, filename, Level, name);
+#endif
+}
+
+cMenuRecordingSelectItem::~cMenuRecordingSelectItem()
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuRecordingSelectItem::~cMenuRecordingSelectItem FileName=%s Name=%s", plugin_name, filename, name);
+#endif
+ FREENULL(filename);
+ FREENULL(name);
+}
+
+bool cMenuRecordingSelectItem::operator< (const cListObject &ListObject)
+{
+ cMenuRecordingSelectItem *temp = (cMenuRecordingSelectItem *)&ListObject;
+ if (isdir != temp->isdir)
+ return isdir;
+ if (isdir)
+ return strcasecmp(name, temp->name) < 0;
+ return start < temp->start;
+}
+
+void cMenuRecordingSelectItem::IncrementCounter(bool New)
+{
+ totalEntries++;
+ if (New)
+ newEntries++;
+ char *buffer = NULL;
+ asprintf(&buffer, "%d\t%d\t%s", totalEntries, newEntries, name);
+ SetText(buffer, false);
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuRecordingSelectItem::IncrementCounter FileName=%s New=%s Buffer=%s", plugin_name, filename, New ? "true" : "false", buffer);
+#endif
+}
+
+// --- cMenuRecordingSelect --------------------------------------------------------
+
+cMenuRecordingSelect::cMenuRecordingSelect(const char *Base, int Level, bool OpenSubMenus, bool SingleSelect)
+:cOsdMenu(Base ? Base : tr("Recordings"), 6, 6, 6)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuRecordingSelect::cMenuRecordingSelect Base=%s Level=%d OpenSubMenus=%s", plugin_name, Base, Level, OpenSubMenus ? "true" : "false");
+#endif
+#if VDRVERSNUM < 10311
+#ifdef HAVE_ELCHI
+ Interface->Status(tr("Display$prepare recording display..."), Setup.Theme == themeVanilla ? clrBlack : (eDvbColor)fginfofont, Setup.Theme == themeVanilla ? clrCyan : clrInfoLine);
+#else
+ Interface->Status(tr("Display$prepare recording display..."));
+#endif
+ Interface->Flush();
+#else
+ STATUS(tr("Display$prepare recording display..."));
+#endif
+ base = Base ? strdup(Base) : NULL;
+ level = Level;
+ singleselect = SingleSelect;
+ Display();
+ cMenuRecordingSelectItem *LastItem = NULL;
+ 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)] == '~'))
+ {
+ cMenuRecordingSelectItem *Item = new cMenuRecordingSelectItem(recording, level);
+ if (*Item->Text() && (!LastItem || strcmp(Item->Text(), LastItemText) != 0))
+ {
+ Add(Item);
+ LastItem = Item;
+ FREENULL(LastItemText);
+ LastItemText = strdup(LastItem->Text());
+ } else
+ delete Item;
+ if (LastItem)
+ {
+ if (LastSelectedRecord && strncmp(LastSelectedRecord, recording->FileName(), strlen(LastSelectedRecord)) == 0)
+ SetCurrent(LastItem);
+ if (LastItem->IsDirectory())
+ LastItem->IncrementCounter(recording->IsNew());
+ }
+ }
+ }
+ free(LastItemText);
+ LastItem = Current() < 0 ? NULL : (cMenuRecordingSelectItem *)Get(Current());
+ Sort();
+ if (LastItem)
+ {
+ SetCurrent(LastItem);
+ if (OpenSubMenus && Open(true) == osContinue)
+ return;
+ } else
+ SetCurrent(First());
+ SetHelpKeys();
+}
+
+cMenuRecordingSelect::~cMenuRecordingSelect()
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuRecordingSelect::~cMenuRecordingSelect Base=%s Level=%d", plugin_name, base, level);
+#endif
+ FREENULL(base);
+}
+
+void cMenuRecordingSelect::SetHelpKeys(void)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuRecordingSelect::SetHelpKeys", plugin_name);
+#endif
+
+ cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)Get(Current());
+ if (ri)
+ {
+ if (ri->IsDirectory())
+ if (singleselect)
+ SetHelp(tr("Open"));
+ else
+ SetHelp(tr("Add"), ri->IsMark() ? tr("UnMark") : tr("Mark"), NULL, NULL);
+ else
+ {
+ cRecording *recording = GetRecording(ri);
+ SetHelp(singleselect ? tr("Select") : tr("Add"), singleselect ? NULL : ri->IsMark() ? tr("UnMark") : tr("Mark"), deleterecords.u ? tr("Delete") : NULL, (recording && recording->Summary() && *recording->Summary()) ? tr("Summary") : NULL);
+ }
+ } else
+ {
+ SetHelp(NULL);
+ }
+}
+
+cRecording *cMenuRecordingSelect::GetRecording(cMenuRecordingSelectItem *Item)
+{
+ cRecording *recording = Recordings.GetByName(Item->FileName());
+ if (!recording)
+ ERROR(tr("Error while accessing recording!"));
+ return recording;
+}
+
+eOSState cMenuRecordingSelect::Open(bool OpenSubMenus)
+{
+ cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)Get(Current());
+ if (ri)
+ {
+ if (ri->IsDirectory())
+ {
+ const char *t = ri->Name();
+ char *buffer = NULL;
+ if (base)
+ {
+ asprintf(&buffer, "%s~%s", base, t);
+ t = buffer;
+ }
+ AddSubMenu(new cMenuRecordingSelect(t, level + 1, OpenSubMenus, singleselect));
+ FREENULL(buffer);
+ return osContinue;
+ } else if (!OpenSubMenus)
+ return AddPlaylist();
+ }
+ return osUnknown;
+}
+
+eOSState cMenuRecordingSelect::AddPlaylist(void)
+{
+ FREENULL(LastSelectedRecord);
+ cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)Get(Current());
+ if (ri)
+ {
+ if (ri->IsDirectory() && singleselect)
+ return Open();
+ LastSelectedRecord = strdup(ri->FileName());
+ if (ri->IsDirectory())
+ {
+ char *last = LastSelectedRecord + strlen(VideoDirectory) + 1;
+ for (int i = level; *last && i >= 0; i--)
+ {
+ last = strchr(last, '/');
+ if (!last)
+ break;
+ last++;
+ }
+ if (last)
+ *last = 0;
+ }
+ if (PlaylistMark.Count() && !ri->IsMark() && Interface->Confirm(tr("Add selected Record to Playlist?")))
+ {
+ cPlaylistMark *pm = new cPlaylistMark(LastSelectedRecord);
+ PlaylistMark.Add(pm);
+ }
+ return osUser1; // Add to Playlist in cMenuPlaylist::ProcessKey
+ }
+ return osUnknown;
+}
+
+eOSState cMenuRecordingSelect::MarkSel(void)
+{
+ if (singleselect)
+ return osContinue;
+ INFO("kommt noch ...?");
+ return osContinue;
+}
+
+eOSState cMenuRecordingSelect::Delete(void)
+{
+ if (!deleterecords.u || HasSubMenu() || Count() == 0)
+ return osContinue;
+ cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)Get(Current());
+ if (ri && !ri->IsDirectory() && Interface->Confirm(tr("Delete recording?")) && DeleteRecording(ri->FileName()))
+ {
+ cOsdMenu::Del(Current());
+ Display();
+ if (!Count())
+ return osBack;
+ }
+ return osContinue;
+}
+
+eOSState cMenuRecordingSelect::Summary(void)
+{
+ if (HasSubMenu() || Count() == 0)
+ return osContinue;
+ cMenuRecordingSelectItem *ri = (cMenuRecordingSelectItem *)Get(Current());
+ if (ri && !ri->IsDirectory())
+ {
+ cRecording *recording = GetRecording(ri);
+ if (recording && recording->Summary() && *recording->Summary())
+#if VDRVERSNUM >= 10307
+ return AddSubMenu(new cMenuText(tr("Summary"), recording->Summary()));
+#else
+ return AddSubMenu(new cMenuItemText(tr("Summary"), recording->Summary()));
+#endif
+ }
+ return osContinue;
+}
+
+eOSState cMenuRecordingSelect::ProcessKey(eKeys Key)
+{
+#ifdef PL_Debug3
+ bool noneKey = Key == kNone;
+ if (!noneKey)
+ dsyslog("%s: cMenuRecordingSelect::ProcessKey Key=%s", plugin_name, KeyName(Key));
+#endif
+
+ eOSState state = cOsdMenu::ProcessKey(Key);
+#ifdef PL_Debug3
+ if (!noneKey || (state != osUnknown && state != osContinue))
+ {
+ dsyslog("%s: cMenuRecordingSelect::ProcessKey OSState=%s", plugin_name, OSStateName(state));
+ noneKey = false;
+ }
+#endif
+
+ switch (state)
+ {
+ case osUnknown: switch (Key)
+ {
+ case kOk: state = Open();
+ break;
+ case kRed: state = AddPlaylist();
+ break;
+ case kGreen: state = MarkSel();
+ break;
+ case kYellow: state = Delete();
+ break;
+ case kBlue: state = Summary();
+ break;
+ default: break;
+ }
+ break;
+ default: break;
+ }
+ if (!HasSubMenu() && Key != kNone)
+ SetHelpKeys();
+
+#ifdef PL_Debug3
+ if (!noneKey || (state != osUnknown && state != osContinue))
+ dsyslog("%s: cMenuRecordingSelect::ProcessKey returned OSState=%s", plugin_name, OSStateName(state));
+#endif
+ return state;
+}
+
+// --- cMenuRecordingEdit -----------------------------------------------------------
+
+cMenuRecordingEdit::cMenuRecordingEdit(cPlaylistRecord *PlaylistRecord, bool ConfirmOptions)
+:cOsdMenu(ConfirmOptions ? tr("Edit$Confirm Options") : tr("Edit$Edit Record"), 33)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuRecordingEdit::cMenuRecordingEdit Playlistentry=%s ConfirmOptions=%s", plugin_name, PlaylistRecord ? PlaylistRecord->Name() : "(null)", ConfirmOptions ? "true" : "false");
+#endif
+ playlistrecord = PlaylistRecord;
+ confirmoptions = ConfirmOptions;
+#if VDRVERSNUM >= 10307
+ editwidth = DisplayMenu()->EditableWidth();
+#endif
+ DisplayStatus[0] = 0;
+ if (playlistrecord)
+ {
+ data = *playlistrecord;
+ Set();
+ }
+ SetHelpKeys();
+}
+
+cMenuRecordingEdit::~cMenuRecordingEdit()
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuRecordingEdit::~cMenuRecordingEdit Playlistentry=%s", plugin_name, playlistrecord ? playlistrecord->Name() : "(null)");
+#endif
+ data.filename = NULL;
+ data.summary = NULL;
+ data.title = NULL;
+ data.path = NULL;
+}
+
+void cMenuRecordingEdit::SetHelpKeys(void)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuRecordingEdit:SetHelpKeys", plugin_name);
+#endif
+
+ char *buffer = NULL;
+ eOptions display = (Current() >= 0) && (Current() < MAXOptionLines) ? displayoption[Current()] : Option_max;
+ if (display < Option_max && data.OptionInherited(display))
+ asprintf(&buffer, "%s %s", tr("OptionPL$is:"), NoYesDefault[data.Option(display)]);
+ if (buffer)
+ {
+ if (strcmp(DisplayStatus, buffer))
+ strn0cpy(DisplayStatus, buffer, MAXOSDTEXTWIDTH);
+ free(buffer);
+ } else
+ if (strlen(DisplayStatus))
+ DisplayStatus[0] = 0;
+ const char *red = strlen(DisplayStatus) ? DisplayStatus : NULL;
+ if (confirmoptions)
+ SetHelp(red);
+ else
+ SetHelp(red, (data.isdir || data.parent) ? NULL : tr("Select"), tr("Delete"), (data.summary && *data.summary) ? tr("Summary") : NULL);
+}
+
+void cMenuRecordingEdit::Set(void)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuRecordingEdit::Set Current=%d", plugin_name, Current());
+#endif
+ for (int i = 0; i < MAXOptionLines; i++)
+ displayoption[i] = Option_max;
+ int current = Current();
+ Clear();
+
+ if (data.path)
+ {
+ char *buffer = NULL;
+ asprintf(&buffer, "%s: %s", tr("Path"), data.path);
+
+#if VDRVERSNUM >= 10307
+ cOsdItem *item;
+ strreplace(buffer, ' ', '|');
+ strreplace(buffer, '~', ' ');
+ cTextWrapper *textwrapper = new cTextWrapper(buffer, cFont::GetFont(fontOsd), editwidth);
+ for (int i = 0; i < textwrapper->Lines(); i++)
+ {
+ char *textbuf = strdup(textwrapper->GetLine(i));
+ strreplace(buffer, ' ', '/');
+ strreplace(buffer, '|', ' ');
+ item = new cOsdItem(textbuf);
+ free(textbuf);
+ item->SetSelectable(false);
+ Add(item);
+ }
+ delete textwrapper;
+ item = new cOsdItem(" ");
+ item->SetSelectable(false);
+ Add(item);
+#else
+ strreplace(buffer, '~', '/');
+ char *pos = buffer;
+ char *pos_next;
+ char *pos_last;
+ char text[MAXOSDWIDTH + 1];
+ int textlen;
+
+ while (*pos)
+ {
+ pos_next = strchr(pos, '\n');
+ if (!pos_next)
+ pos_next = pos + strlen(pos);
+ textlen = pos_next - pos;
+ if (textlen < (Setup.OSDwidth - 1))
+ {
+ strn0cpy(text, pos, textlen + 1);
+ } else
+ {
+ strn0cpy(text, pos, Setup.OSDwidth - 1);
+ pos_last = strrchr(text, '/');
+ if (!pos_last)
+ pos_last = text + Setup.OSDwidth - 1;
+ *pos_last = 0;
+ textlen = pos_last - text;
+ }
+ Add(new cOsdItem(text));
+ pos += textlen;
+ if (*pos) pos++;
+ }
+ Add(new cOsdItem(" "));
+#endif
+ free(buffer);
+ }
+#if VDRVERSNUM < 10307
+ firstline = Count();
+#endif
+
+ Add(new cMenuEditStrItem(tr("OptionPL$Name"), data.name, sizeof(data.name), tr(FileNameChars)));
+ if (current < Count())
+ current = Count();
+ if (data.isdir)
+ {
+ displayoption[Count()] = Option_searchnewrecord;
+ Add(new cMenuEditStraItem(tr("OptionPL$Search new records on folders"), &data.options[Option_searchnewrecord], 4, NoYesDefault));
+ displayoption[Count()] = Option_searchrecordsub;
+ Add(new cMenuEditStraItem(tr("OptionPL$Search records on subfolders"), &data.options[Option_searchrecordsub], 4, NoYesDefault));
+ displayoption[Count()] = Option_playonlynew;
+ Add(new cMenuEditStraItem(tr("OptionPL$Play only new Records"), &data.options[Option_playonlynew], data.parent ? 5 : 4, NoYesDefault));
+ }
+ displayoption[Count()] = Option_jumpmark;
+ Add(new cMenuEditStraItem(tr("OptionPL$Jump to first segment of movie"), &data.options[Option_jumpmark], data.parent ? 5 : 4, NoYesDefault));
+ displayoption[Count()] = Option_confirmstartnewrecord;
+ Add(new cMenuEditStraItem(tr("OptionPL$Confirm start new record"), &data.options[Option_confirmstartnewrecord], data.parent ? 5 : 4, NoYesDefault));
+ displayoption[Count()] = Option_deletefromlist;
+ Add(new cMenuEditStraItem(tr("OptionPL$Remove records after play from list"), &data.options[Option_deletefromlist], data.parent ? 5 : 4, NoYesDefault));
+ displayoption[Count()] = Option_deleterecord;
+ Add(new cMenuEditStraItem(tr("OptionPL$Delete records after play"), &data.options[Option_deleterecord], data.parent ? 5 : 4, NoYesDefault));
+ if (data.options[Option_deleterecord] != NoYesDefault_no)
+ {
+ displayoption[Count()] = Option_confirmdeleterecord;
+ Add(new cMenuEditStraItem(tr("OptionPL$ Confirm delete records"), &data.options[Option_confirmdeleterecord], data.parent ? 5 : 4, NoYesDefault));
+ }
+ SetCurrent(Get(current));
+ Display();
+}
+
+eOSState cMenuRecordingEdit::Summary(void)
+{
+ if (!HasSubMenu() && !data.isdir && data.summary && *data.summary)
+#if VDRVERSNUM >= 10307
+ return AddSubMenu(new cMenuText(tr("Summary"), data.summary));
+#else
+ return AddSubMenu(new cMenuItemText(tr("Summary"), data.summary));
+#endif
+
+
+ return osContinue;
+}
+
+eOSState cMenuRecordingEdit::ProcessKey(eKeys Key)
+{
+#ifdef PL_Debug3
+ bool noneKey = Key == kNone;
+ if (!noneKey)
+ dsyslog("%s: cMenuRecordingEdit::ProcessKey Key=%s", plugin_name, KeyName(Key));
+#endif
+ int m_deleterecord = data.options[Option_deleterecord];
+
+ eOSState state = cOsdMenu::ProcessKey(Key);
+#ifdef PL_Debug3
+ if (!noneKey || (state != osUnknown && state != osContinue))
+ {
+ dsyslog("%s: cMenuRecordingEdit::ProcessKey OSState=%s", plugin_name, OSStateName(state));
+ noneKey = false;
+ }
+#endif
+
+ if (m_deleterecord != data.options[Option_deleterecord])
+ Set();
+
+#if VDRVERSNUM < 10307
+ if (Current() < firstline)
+ {
+ DisplayCurrent(false);
+ SetCurrent(Get(firstline));
+ DisplayCurrent(true);
+ }
+#endif
+
+ char *buffer = NULL;
+ eOptions display = (Current() >= 0) && (Current() < MAXOptionLines) ? displayoption[Current()] : Option_max;
+/* if (display < Option_max && data.OptionInherited(display))
+ asprintf(&buffer, "%s %s", tr("OptionPL$Effective setting is:"), NoYesDefault[data.Option(display)]);
+ if (buffer)
+ {
+ if (strcmp(DisplayStatus, buffer))
+ {
+ strn0cpy(DisplayStatus, buffer, MAXOSDTEXTWIDTH);
+ SetStatus(DisplayStatus);
+ }
+ free(buffer);
+ } else
+ {
+ if (strlen(DisplayStatus))
+ {
+ DisplayStatus[0] = 0;
+ SetStatus(NULL);
+ }
+ }*/
+
+ switch (state)
+ {
+ case osUnknown: switch (Key)
+ {
+ case kOk: strn0cpy(data.name, skipspace(stripspace(data.name)), sizeof(data.name));
+ Display();
+ if (!strlen(data.name))
+ {
+ ERROR(tr("Error$Missing playlistentry name!"));
+ break;
+ }
+ if (playlistrecord)
+ {
+ data.isdel = playlistrecord->isdel;
+ if (data != *playlistrecord)
+ {
+ *playlistrecord = data;
+ if (playlistrecord->Playlist())
+ playlistrecord->Playlist()->SetChange();
+ if (verbose.u)
+ isyslog("%s: playlistentry %d modified (%s)", plugin_name, playlistrecord->Index() + 1, playlistrecord->name);
+ }
+ data.filename = NULL;
+ state = osBack;
+ }
+ break;
+ case kRed: state = osContinue;
+ break;
+ case kGreen: LastSelectedRecord = playlistrecord->filename;
+ state = AddSubMenu(new cMenuRecordingSelect(NULL, 0, true, true));
+ break;
+ case kYellow: state = osUser2; // delete Playlistentry in cMenuPlaylist::ProcessKey
+ break;
+ case kBlue: state = Summary();
+ break;
+ default: break;
+ }
+ break;
+ case osUser1: state = CloseSubMenu();
+ if (state == osContinue && LastSelectedRecord && *LastSelectedRecord && LastSelectedRecord[strlen(LastSelectedRecord) - 1] != '/')
+ {
+ playlistrecord->SetName(LastSelectedRecord);
+ playlistrecord->CopyFromRecording();
+ data = *playlistrecord;
+ Set();
+ }
+ break;
+ default: break;
+ }
+ if (!HasSubMenu() && Key != kNone)
+ SetHelpKeys();
+
+#ifdef PL_Debug3
+ if (!noneKey || (state != osUnknown && state != osContinue))
+ dsyslog("%s: cMenuRecordingEdit::ProcessKey returned OSState=%s", plugin_name, OSStateName(state));
+#endif
+ return state;
+}
+
+// --- cMenuPlaylistItem --------------------------------------------------------
+
+cMenuPlaylistItem::cMenuPlaylistItem(cPlaylistRecord *PlaylistRecord)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylistItem::cMenuPlaylistItem Playlistentry=%s", plugin_name, PlaylistRecord ? PlaylistRecord->Name() : "(null)");
+#endif
+ playlistrecord = PlaylistRecord;
+ Set();
+}
+
+cMenuPlaylistItem::~cMenuPlaylistItem()
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylistItem::~cMenuPlaylistItem Playlistentry=%s", plugin_name, playlistrecord ? playlistrecord->Name() : "(null)");
+#endif
+}
+
+void cMenuPlaylistItem::Set(void)
+{
+ char *buffer = NULL;
+ if (playlistrecord)
+ {
+ if (playlistrecord->IsDel())
+ asprintf(&buffer, "\t%s", tr("Error$Playlistentry or Record is deleted"));
+ else if (playlistrecord->IsDir())
+ asprintf(&buffer, "%c\t%s", charfolder.u, playlistrecord->Name());
+ else
+ asprintf(&buffer, "%c\t%s\t%s", playlistrecord->Parent() ? charentry.u : charrecord.u, playlistrecord->Title(), playlistrecord->Name());
+ } else
+ buffer = strdup(tr("Error$Playlistentry is not set"));
+ SetText(buffer, false);
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylistItem::Set SetText=%s", plugin_name, buffer);
+#endif
+}
+
+// --- cMenuPlaylist -----------------------------------------------------------
+
+cMenuPlaylist::cMenuPlaylist(cPlaylist *Playlist)
+:cOsdMenu(tr("Display$Display Playlist"), 2, 6, 7, 5)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylist::cMenuPlaylist", plugin_name);
+#endif
+
+ playlist = Playlist;
+ if (playlist)
+ for (cPlaylistRecord *plr = playlist->First_PLR(); plr; plr = playlist->Next_PLR(plr))
+ if (!plr->IsDel())
+ Add(new cMenuPlaylistItem(plr));
+ addrecords = false;
+ if (Count())
+ {
+ SetHelpKeys();
+ Display();
+ } else
+ AddSubMenu(new cMenuRecordingSelect(NULL, 0, true));
+}
+
+cMenuPlaylist::~cMenuPlaylist(void)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylist::~cMenuPlaylist", plugin_name);
+#endif
+ playlist = NULL;
+}
+
+void cMenuPlaylist::SetHelpKeys(void)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylist::SetHelpKeys", plugin_name);
+#endif
+ if (Count())
+ SetHelp((playlist && *playlist->Name()) ? tr("Play") : NULL, tr("New"), tr("Delete"), tr("Mark"));
+ else
+ SetHelp(NULL, tr("New"), NULL, NULL);
+}
+
+eOSState cMenuPlaylist::Play(void)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylist::Play", plugin_name);
+#endif
+ cPlaylistRecord *plr = CurrentPlaylistRecord();
+ if (HasSubMenu() || !plr || !playlist || !*playlist->Name())
+ return osContinue;
+ if (verbose.u)
+ isyslog("%s: start play PlaylistRecord %d Option=%d", plugin_name, plr->Index() + 1, playlist->Playoption(Option_playoption2));
+ playlist->SearchRecords();
+ cPlaylistRecord *plr_selected = plr;
+ cPlaylistRecord *plr_firstnomal = playlist->Firstnormal_PLR();
+ cPlaylistRecord *plr_firstnew = playlist->Firstnew_PLR();
+ cPlaylistRecord *plr_lastplayed = playlist->Lastplayed_PLR();
+ while (plr_selected && plr_selected->IsDirOrDel())
+ plr_selected = playlist->Next_PLR(plr_selected);
+ switch (playlist->Playoption(Option_playoption2))
+ {
+ case PlayOptions_selectpos: SelectPLR = plr_selected;
+ if (!SelectPLR)
+ ERROR(tr("Error$At this position and after no recording found!"));
+ break;
+ case PlayOptions_firstpos: SelectPLR = plr_firstnomal;
+ break;
+ case PlayOptions_firstnew: if (plr_firstnew)
+ SelectPLR = plr_firstnew;
+ else
+ SelectPLR = Interface->Confirm(tr("Question$No new recording found! Play first?")) ? plr_firstnomal : NULL;
+ break;
+ case PlayOptions_lastplay: if (plr_lastplayed)
+ {
+ SelectPLR = plr_lastplayed;
+ break;
+ }
+ // no break!
+ case PlayOptions_question: if (plr_selected && Interface->Confirm(tr("Question$Play selected recording?")))
+ {
+ SelectPLR = plr_selected;
+ break;
+ }
+ if (plr_lastplayed && Interface->Confirm(tr("Question$Play last played recording?")))
+ {
+ SelectPLR = plr_lastplayed;
+ break;
+ }
+ if (plr_firstnew && plr_firstnew != plr_firstnomal && Interface->Confirm(tr("Question$Play first new recording?")))
+ {
+ SelectPLR = plr_firstnew;
+ break;
+ }
+ SelectPLR = plr_firstnomal;
+ break;
+ }
+ return SelectPLR ? osUser9 : osContinue; // osUSer9 starts play playlist with SelectPLR in cControlMenu::ProcessKey
+}
+
+eOSState cMenuPlaylist::Edit(void)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylist::Edit", plugin_name);
+#endif
+ if (HasSubMenu() || !CurrentPlaylistRecord())
+ return osContinue;
+ isyslog("%s: editing Playlistentry %d", plugin_name, CurrentPlaylistRecord()->Index() + 1);
+ return AddSubMenu(new cMenuRecordingEdit(CurrentPlaylistRecord()));
+}
+
+bool cMenuPlaylist::AddPlaylistentrys()
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylist::AddPlaylistentrys Add=%s", plugin_name, LastSelectedRecord);
+#endif
+ static cPlaylistRecord *playlistrecord = NULL;
+ bool iswithdir = LastSelectedRecord && LastSelectedRecord[strlen(LastSelectedRecord) - 1] == '/';
+ if (!playlistrecord && iswithdir)
+ {
+ playlistrecord = new cPlaylistRecord(NULL,LastSelectedRecord);
+ AddSubMenu(new cMenuRecordingEdit(playlistrecord, true));
+ addrecords = true;
+ return true;
+ }
+ if (!playlist || !playlist->RecordCol2())
+ return false;
+ if (iswithdir)
+ {
+ PlaylistSort.Clear();
+ cPlaylistRecord *p_plr = new cPlaylistRecord(playlist, LastSelectedRecord);
+ p_plr->CopyOptions(playlistrecord);
+ playlist->RecordCol2()->Add(p_plr);
+ cMenuPlaylistItem *mpli = new cMenuPlaylistItem(p_plr);
+ Add(mpli);
+ SetCurrent(mpli);
+ cPlaylistRecord *plr = NULL;
+ for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording))
+ {
+ if (strstr(recording->FileName(), LastSelectedRecord) == recording->FileName())
+ {
+ const char *next = NULL;
+ if (!p_plr->Option(Option_searchrecordsub))
+ {
+ const char *test = recording->FileName() + strlen(LastSelectedRecord);
+ const char *temp = strchr(test, '/');
+ if (temp)
+ next = strchr(temp + 1, '/');
+ }
+ if (!next)
+ {
+ plr = new cPlaylistRecord(playlist, recording, p_plr);
+ PlaylistSort.Add(plr);
+ }
+ }
+ }
+ PlaylistSort.Sort();
+ cPlaylistRecord *nplr = NULL;
+ for (plr = PlaylistSort.First(); plr; plr = nplr)
+ {
+ nplr = PlaylistSort.Next(plr);
+ PlaylistSort.Del(plr, false);
+ playlist->RecordCol2()->Add(plr);
+ Add(new cMenuPlaylistItem(plr));
+ }
+ } else
+ { // one record to add
+ cPlaylistRecord *plr = new cPlaylistRecord(playlist, LastSelectedRecord);
+ playlist->RecordCol2()->Add(plr);
+ cMenuPlaylistItem *mpli = new cMenuPlaylistItem(plr);
+ Add(mpli);
+ SetCurrent(mpli);
+ }
+ playlist->SetChange();
+ addrecords = false;
+ DELETENULL(playlistrecord);
+ Display();
+ return true;
+}
+
+eOSState cMenuPlaylist::New(void)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylist::New", plugin_name);
+#endif
+ if (HasSubMenu())
+ return osContinue;
+ cOsdMenu *menu = new cMenuRecordingSelect(NULL, 0, true);
+ eOSState state = AddSubMenu(menu);
+ if (LastSelectedRecord && LastSelectedRecord[strlen(LastSelectedRecord) - 1] == '/')
+ menu->ProcessKey(kBack);
+ return state;
+}
+
+eOSState cMenuPlaylist::Delete(void)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylist::Delete", plugin_name);
+#endif
+ cPlaylistRecord *plr = CurrentPlaylistRecord();
+ if (plr && playlist)
+ {
+ if (!confirmdelplentry.u || Interface->Confirm(tr("Edit$Delete Playlistentry?")))
+ {
+ if (verbose.u)
+ isyslog("%s: Playlistentry %d deleted", plugin_name, plr->Index() + 1);
+ plr->SetDel();
+ playlist->SetChange();
+ cOsdMenu::Del(Current());
+ Display();
+ }
+ }
+ return osContinue;
+}
+
+void cMenuPlaylist::Move(int From, int To)
+{
+#ifdef PL_Debug1
+ dsyslog("%s: cMenuPlaylist::Move from=%d to=%d", plugin_name, From, To);
+#endif
+ if (playlist && playlist->RecordCol2())
+ {
+ cMenuPlaylistItem *temp = (cMenuPlaylistItem *)Get(From);
+ cPlaylistRecord *plr_f = temp ? temp->PlaylistRecord() : NULL;
+ temp = (cMenuPlaylistItem *)Get(To);
+ cPlaylistRecord *plr_t = temp ? temp->PlaylistRecord() : NULL;
+ cPlaylistRecord *plr_p = NULL;
+ if (To > 0)
+ {
+ temp = (cMenuPlaylistItem *)Get(To - 1);
+ plr_p = temp ? temp->PlaylistRecord() : NULL;
+ }
+ // plr_f --> cPlaylistRecord (Source)
+ // plr_t --> cPlaylistRecord at Targetposition
+ // plr_p --> cPlaylistRecord before Targetposition
+ if (!plr_f || !plr_t)
+ {
+ esyslog("%s: Error while get playlistentries in move-function", plugin_name);
+ return;
+ }
+ if (plr_f->Parent() == plr_t->Parent() || (plr_p && plr_f->Parent() == plr_p->Parent()))
+ {
+ playlist->RecordCol2()->Move(plr_f->Index(), plr_t->Index());
+ playlist->SetChange();
+ cOsdMenu::Move(From, To);
+ Display();
+ } else
+ ERROR(tr("Error$Move between folders and not folders not allowed."));
+ }
+}
+
+cPlaylistRecord *cMenuPlaylist::CurrentPlaylistRecord(void)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cMenuPlaylist::CurrentPlaylistRecord", plugin_name);
+#endif
+ cMenuPlaylistItem *item = (cMenuPlaylistItem *)Get(Current());
+ return item ? item->PlaylistRecord() : NULL;
+}
+
+eOSState cMenuPlaylist::ProcessKey(eKeys Key)
+{
+#ifdef PL_Debug3
+ bool noneKey = Key == kNone;
+ if (!noneKey)
+ dsyslog("%s: cMenuPlaylist::ProcessKey Key=%s", plugin_name, KeyName(Key));
+#endif
+ int n;
+ bool hSubMenu = HasSubMenu();
+
+ eOSState state = cOsdMenu::ProcessKey(Key);
+#ifdef PL_Debug3
+ if (!noneKey || (state != osUnknown && state != osContinue))
+ {
+ dsyslog("%s: cMenuPlaylist::ProcessKey OSState=%s", plugin_name, OSStateName(state));
+ noneKey = false;
+ }
+#endif
+
+ if (!HasSubMenu() && hSubMenu)
+ {
+ for (cOsdItem *item = First(); item; item = Next(item))
+ item->Set();
+ if (addrecords)
+ AddPlaylistentrys(); // submenu for folder-options is closed
+ else
+ Display();
+ }
+
+ switch (state)
+ {
+ case osUnknown: switch (Key)
+ {
+ case k0...k9: n = (Key == k0) ? 10 : (Key - k0);
+ if (n > Count())
+ break;
+ SetCurrent(Get(--n));
+ // no break!
+ case kOk: state = Edit();
+ break;
+ case kRed: state = Play();
+ break;
+ case kGreen: state = New();
+ break;
+ case kYellow: state = Delete();
+ break;
+ case kBlue: if (!HasSubMenu())
+ {
+ Mark();
+ state = osContinue;
+ }
+ break;
+ default: break;
+ }
+ break;
+ case osUser1: state = CloseSubMenu();
+ if (state == osContinue)
+ AddPlaylistentrys();
+ break;
+ case osUser2: state = CloseSubMenu();
+ if (state == osContinue)
+ state = Delete();
+ break;
+ default: break;
+ }
+ if (!HasSubMenu() && Key != kNone)
+ SetHelpKeys();
+
+#ifdef PL_Debug3
+ if (!noneKey || (state != osUnknown && state != osContinue))
+ dsyslog("%s: cMenuPlaylist::ProcessKey returned OSState=%s", plugin_name, OSStateName(state));
+#endif
+ return state;
+}