diff options
author | Martin Dummer <martin.dummer@gmx.net> | 2012-07-01 20:15:45 +0200 |
---|---|---|
committer | Martin Dummer <martin.dummer@gmx.net> | 2012-07-01 20:15:45 +0200 |
commit | 28498899a405329e3c8c8fc9af5d573d1d2f923e (patch) | |
tree | f7736f603c1a8281353dec79e77a269dc207eb4b /menucontrol.c | |
download | vdr-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.c | 391 |
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; +} |