summaryrefslogtreecommitdiff
path: root/menucontrol.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 /menucontrol.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 'menucontrol.c')
-rw-r--r--menucontrol.c391
1 files changed, 391 insertions, 0 deletions
diff --git a/menucontrol.c b/menucontrol.c
new file mode 100644
index 0000000..4ea34ed
--- /dev/null
+++ b/menucontrol.c
@@ -0,0 +1,391 @@
+/*
+ * playlist: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id: menucontrol.c 0.2 2004/10/08 02:34:00 hflor Exp $
+ */
+
+#include "menucontrol.h"
+#include "menuplaylists.h"
+#include "playlist.h"
+#include "vdrtools.h"
+#include <vdr/recording.h>
+#include <vdr/remote.h>
+#include <vdr/interface.h>
+
+// --- cControlPlaylist -----------------------------------------------------------
+
+cControlPlaylist::cControlPlaylist(void)
+:cControl(NULL)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cControlPlaylist::cControlPlaylist", plugin_name);
+#endif
+
+ replaycontrol = NULL;
+ if (SelectPLR)
+ PlayRecording(SelectPLR);
+ else
+ cRemote::Put(kBack);
+}
+
+cControlPlaylist::~cControlPlaylist(void)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cControlPlaylist::~cControlPlaylist", plugin_name);
+#endif
+ if (replaycontrol)
+ DELETENULL(replaycontrol);
+ PlayedPLR = NULL;
+#ifdef PL_Debug2
+ dsyslog("%s: PlayedPLR=(null)", plugin_name);
+#endif
+}
+
+void cControlPlaylist::Hide(void)
+{
+ if (replaycontrol)
+ replaycontrol->Hide();
+}
+
+eOSState cControlPlaylist::ProcessKey(eKeys Key)
+{
+#ifdef PL_Debug3
+ bool noneKey = Key == kNone;
+ if (!noneKey)
+ dsyslog("%s: cControlPlaylist::ProcessKey Key=%s", plugin_name, KeyName(Key));
+#endif
+
+ eOSState state = osUnknown;
+ if (replaycontrol)
+ state = replaycontrol->ProcessKey(Key);
+#ifdef PL_Debug3
+ if (!noneKey || state != osUnknown)
+ {
+ dsyslog("%s: cControlPlaylist::ProcessKey OSState=%s", plugin_name, OSStateName(state));
+ noneKey = false;
+ }
+#endif
+
+ char *temp = NULL;
+ cPlaylistRecord *plr = PlayedPLR;
+ cPlaylist *playlist = plr ? plr->Playlist() : NULL;
+ switch (state)
+ {
+ case osUnknown: switch (NORMALKEY(Key))
+ {
+ case k1: if (playlist)
+ {
+ if (plr)
+ plr = playlist->Prev_PLR(plr);
+ while (plr && (plr->IsDirOrDel()))
+ plr = playlist->Prev_PLR(plr);
+ if (!plr && Interface->Confirm(tr("Play$Currently play first Record! Jump to last?")))
+ {
+ plr = playlist->Last_PLR();
+ while (plr && (plr->IsDirOrDel()))
+ plr = playlist->Prev_PLR(plr);
+ }
+ }
+ state = osContinue;
+ break;
+ case k3: if (playlist)
+ {
+ if (plr)
+ plr = playlist->Next_PLR(plr);
+ while (plr && (plr->IsDirOrDel()))
+ plr = playlist->Next_PLR(plr);
+ if (!plr && Interface->Confirm(tr("Play$Currently play last Record! Jump to first?")))
+ {
+ plr = playlist->First_PLR();
+ while (plr && (plr->IsDirOrDel()))
+ plr = playlist->Next_PLR(plr);
+ }
+ }
+ state = osContinue;
+ break;
+ case kBack: state = osEnd;
+ break;
+ default: break;
+ }
+ if (state == osContinue && plr)
+ {
+ bool visible = replaycontrol ? replaycontrol->Visible() : false;
+ UpdateRecording();
+ state = PlayRecording(plr, visible);
+ }
+ break;
+ case osRecordings: // kBack while playing
+ UpdateRecording();
+ cControl::Shutdown();
+ if (ControlMenuIsOpen)
+ state = osUser8;
+ else
+ {
+ if (playlist)
+ playlist->SaveRecordCol();
+ state = osEnd;
+ }
+ break;
+ case osEnd: // end of playing
+ {
+ bool visible = replaycontrol ? replaycontrol->Visible() : false;
+ UpdateRecording();
+ if (playlist)
+ {
+ cPlaylistRecord *plr_n = playlist->Next_PLR(plr);
+ asprintf(&temp, "%s %s", tr("Play$Delete recording:"), plr->Name());
+ if (deleterecords.u && plr->Option(Option_deleterecord) && (!plr->Option(Option_confirmdeleterecord) || Interface->Confirm(temp)))
+ plr->DeleteRecord();
+ else if (plr->Option(Option_deletefromlist))
+ {
+ plr->SetDel();
+ playlist->SetChange();
+ }
+ FREENULL(temp);
+ plr = plr_n;
+ while (plr && (plr->IsDirOrDel() || (plr->Option(Option_playonlynew) && !plr->IsNew())))
+ plr = playlist->Next_PLR(plr);
+ if (plr)
+ {
+ asprintf(&temp, "%s %s", tr("Play$Start next recording:"), plr->Name());
+ if (!plr->Option(Option_confirmstartnewrecord) || Interface->Confirm(temp))
+ state = PlayRecording(plr, visible);
+ else
+ plr = NULL;
+ FREENULL(temp);
+ }
+ } else
+ plr = NULL;
+ if (!plr)
+ {
+ if (playlist)
+ playlist->SaveRecordCol();
+ cControl::Shutdown();
+ }
+ }
+ break;
+ default: break;
+ }
+#ifdef PL_Debug3
+ if (!noneKey || state != osUnknown)
+ dsyslog("%s: cControlPlaylist::ProcessKey returned OSState=%s", plugin_name, OSStateName(state));
+#endif
+ return state;
+}
+
+eOSState cControlPlaylist::PlayRecording(cPlaylistRecord *PlaylistRecord, bool Visible)
+{
+#ifdef PL_Debug1
+ dsyslog("%s: cControlPlaylist::PlayRecording Name=%s FileName=%s", plugin_name, PlaylistRecord ? PlaylistRecord->Name() : NULL, PlaylistRecord ? PlaylistRecord->Filename() : NULL);
+#endif
+
+ static char title[MaxFileName];
+ eOSState state = osEnd;
+ DELETENULL(replaycontrol);
+ if (PlaylistRecord)
+ {
+ if (PlaylistRecord->IsNew() && !PlaylistRecord->IsEdited() && PlaylistRecord->Option(Option_jumpmark))
+ {
+ cResumeFile *resume = new cResumeFile(PlaylistRecord->Filename());
+ int res = resume->Read();
+ delete resume;
+ if (res < 0) // new file
+ {
+ cMarks *marks = new cMarks;
+ if (marks)
+ {
+ marks->Load(PlaylistRecord->Filename());
+ if (marks->Count())
+ {
+ int mark = marks->First()->position;
+ if (mark < 100 && marks->Count() > 2)
+ {
+ mark = marks->GetNext(mark)->position;
+ mark = marks->GetNext(mark)->position;
+ }
+ cResumeFile *resume = new cResumeFile(PlaylistRecord->Filename());
+ if (mark > 0 && resume)
+ {
+ resume->Save(mark);
+ DELETENULL(resume);
+ }
+ }
+ }
+ }
+ }
+ char *buffer;
+ if (PlaylistRecord->Playlist())
+ {
+ asprintf(&buffer, "%d/%d %s", PlaylistRecord->IndexRec(), PlaylistRecord->Playlist()->RecordCount(true), PlaylistRecord->Name());
+ PlaylistRecord->Playlist()->SetLastRecord(PlaylistRecord->Filename());
+ PlaylistCol.Save();
+ } else
+ buffer = strdup(PlaylistRecord->Name());
+ strn0cpy(title, buffer, MaxFileName);
+ free(buffer);
+ if (verbose.u)
+ dsyslog("%s: start new replay Name=%s Directory=%s", plugin_name, title, PlaylistRecord->Filename());
+ cReplayControl::SetRecording(NULL, NULL);
+ cReplayControl::SetRecording(PlaylistRecord->Filename(), title);
+ replaycontrol = new cReplayControlPlaylist;
+ if (replaycontrol)
+ {
+ player = replaycontrol->GetPlayerPlaylist();
+ if (cDevice::PrimaryDevice()->AttachPlayer(player))
+ state = osContinue;
+ PlayedPLR = PlaylistRecord;
+#ifdef PL_Debug2
+ dsyslog("%s: PlayedPLR=(null)", plugin_name, PlayedPLR ? PlayedPLR->Name() : "(null)");
+#endif
+ if (Visible)
+ replaycontrol->Show();
+ if (PlaylistRecord && PlaylistRecord->Playlist())
+ strn0cpy(lastplaylist.u, PlaylistRecord->Playlist()->Name(), sizeof(lastplaylist.u));
+ else
+ lastplaylist.u[0] = 0;
+ if (strcmp(lastplaylist.u, lastplaylist.o))
+ {
+ PluginPlaylist->SetupStore("lastpl", lastplaylist.u);
+ strcpy(lastplaylist.o, lastplaylist.u);
+ }
+ }
+ }
+ return state;
+}
+
+void cControlPlaylist::UpdateRecording(void)
+{
+#ifdef PL_Debug1
+ dsyslog("%s: cControlPlaylist::UpdateRecording PlayedPLR=%s", plugin_name, PlayedPLR ? PlayedPLR->Filename() : "(null)");
+#endif
+
+ DELETENULL(replaycontrol);
+ cRecording *recording_n = NULL;
+ if (PlayedPLR)
+ {
+ cRecording *recording_o = Recordings.GetByName(PlayedPLR->Filename());
+ recording_n = new cRecording(PlayedPLR->Filename());
+ if (recording_o && recording_n)
+ {
+ Recordings.Add(recording_n, recording_o);
+ Recordings.Del(recording_o);
+ }
+ }
+ for (cPlaylist *pl = PlaylistCol.First(); pl; pl = PlaylistCol.Next(pl))
+ for (cPlaylistRecord *plr = pl->First_PLR(); plr; plr = pl->Next_PLR(plr))
+ if (strcasecmp(plr->Filename(), PlayedPLR->Filename()) == 0)
+{
+ dsyslog("%s: playlist=%s isnew=%s", plugin_name, pl->Name(), recording_n ? recording_n->IsNew() ? "true" : "false" : "(null)");
+ if (recording_n)
+ plr->SetNew(recording_n->IsNew());
+ else
+ plr->SetDel();
+}
+}
+
+// --- cControlMenu -----------------------------------------------------------
+
+cControlMenu::cControlMenu(void)
+:cOsdObject(true)
+{
+#ifdef PL_Debug2
+ dsyslog("%s: cControlMenu::cControlMenu Startoption=%d", plugin_name, startoption.u);
+#endif
+
+ ControlMenuIsOpen = true;
+ switch (startoption.u)
+ {
+ case Start_DisplayPL: osdmenu = new cMenuPlaylists;
+ break;
+ case Start_DisplayLast: osdmenu = new cMenuPlaylists;
+ if (SelectPLR)
+ osdmenu->ProcessKey(kUser1);
+ break;
+ case Start_PlayLast: osdmenu = new cMenuPlaylists;
+ if (SelectPLR)
+ {
+ if (osdmenu->ProcessKey(kUser2) == osUser9)
+ {
+ DELETENULL(osdmenu);
+ cControl::Shutdown();
+ cControl::Launch(new cControlPlaylist);
+ }
+ }
+ break;
+ case Start_NewEmpty: osdmenu = new cMenuPlaylists;
+ osdmenu->ProcessKey(kUser3);
+ break;
+ }
+}
+
+cControlMenu::~cControlMenu()
+{
+#ifdef PL_Debug
+ dsyslog("%s: cControlMenu::~cControlMenu", plugin_name);
+#endif
+ if (osdmenu)
+ DELETENULL(osdmenu);
+ ControlMenuIsOpen = false;
+}
+
+void cControlMenu::Show(void)
+{
+ if (osdmenu)
+ osdmenu->Display();
+}
+
+eOSState cControlMenu::ProcessKey(eKeys Key)
+{
+#ifdef PL_Debug3
+ bool noneKey = Key == kNone;
+ if (!noneKey)
+ dsyslog("%s: cControlMenu::ProcessKey Key=%s", plugin_name, KeyName(Key));
+#endif
+
+ eOSState state;
+ cOsdObject *Interact = osdmenu ? (cOsdObject*)osdmenu : cControl::Control();
+ if (Interact)
+ state = Interact->ProcessKey(Key);
+ else
+ state = cOsdObject::ProcessKey(Key);
+
+#ifdef PL_Debug3
+ if (!noneKey || (state != osUnknown && state != osContinue))
+ {
+ dsyslog("%s: cControlMenu::ProcessKey OSState=%s", plugin_name, OSStateName(state));
+ noneKey = false;
+ }
+#endif
+
+ switch (state)
+ {
+ case osUnknown: switch (NORMALKEY(Key))
+ {
+ case kBack: state = osEnd;
+ break;
+ default: break;
+ }
+ break;
+ case osUser8: osdmenu = new cMenuPlaylists;
+ if (SelectPLR)
+ osdmenu->ProcessKey(kUser1);
+ break;
+ case osUser9: if (SelectPLR)
+ {
+ DELETENULL(osdmenu);
+ cControl::Shutdown();
+ cControl::Launch(new cControlPlaylist);
+ }
+ state = osContinue;
+ break;
+ default: break;
+ }
+
+#ifdef PL_Debug3
+ if (!noneKey || (state != osUnknown && state != osContinue))
+ dsyslog("%s: cControlMenu::ProcessKey returned OSState=%s", plugin_name, OSStateName(state));
+#endif
+ return state;
+}