/* * menu.h: The actual menu implementations * * See the main source file 'vdr.c' for copyright information and * how to reach the author. * * $Id: menu.h 5.1 2020/12/26 15:49:01 kls Exp $ */ #ifndef __MENU_H #define __MENU_H #include "ci.h" #include "device.h" #include "epg.h" #include "osdbase.h" #include "dvbplayer.h" #include "menuitems.h" #include "recorder.h" #include "skins.h" class cMenuText : public cOsdMenu { private: char *text; eDvbFont font; public: cMenuText(const char *Title, const char *Text, eDvbFont Font = fontOsd); virtual ~cMenuText(); void SetText(const char *Text); virtual void Display(void); virtual eOSState ProcessKey(eKeys Key); }; class cMenuFolder : public cOsdMenu { private: cNestedItemList *nestedItemList; cList *list; cString dir; cOsdItem *firstFolder; bool editing; int helpKeys; void SetHelpKeys(void); void Set(const char *CurrentFolder = NULL); void DescendPath(const char *Path); eOSState SetFolder(void); eOSState Select(bool Open); eOSState New(void); eOSState Delete(void); eOSState Edit(void); cMenuFolder(const char *Title, cList *List, cNestedItemList *NestedItemList, const char *Dir, const char *Path = NULL); public: cMenuFolder(const char *Title, cNestedItemList *NestedItemList, const char *Path = NULL); cString GetFolder(void); virtual eOSState ProcessKey(eKeys Key); }; class cMenuCommands : public cOsdMenu { private: cList *commands; cString parameters; cString title; cString command; bool confirm; char *result; bool Parse(const char *s); eOSState Execute(void); public: cMenuCommands(const char *Title, cList *Commands, const char *Parameters = NULL); virtual ~cMenuCommands(); virtual eOSState ProcessKey(eKeys Key); }; class cMenuEditTimer : public cOsdMenu { private: static const cTimer *addedTimer; cTimer *timer; cTimer data; int channel; bool addIfConfirmed; cStringList svdrpServerNames; char remote[HOST_NAME_MAX]; cMenuEditStrItem *pattern; cMenuEditStrItem *file; cMenuEditDateItem *day; cMenuEditDateItem *firstday; eOSState SetFolder(void); void SetFirstDayItem(void); void SetPatternItem(bool Initial = false); void SetHelpKeys(void); public: cMenuEditTimer(cTimer *Timer, bool New = false); virtual ~cMenuEditTimer(); virtual eOSState ProcessKey(eKeys Key); static const cTimer *AddedTimer(void); }; class cMenuEvent : public cOsdMenu { private: const cEvent *event; public: cMenuEvent(const cTimers *Timers, const cChannels *Channels, const cEvent *Event, bool CanSwitch = false, bool Buttons = false); virtual void Display(void); virtual eOSState ProcessKey(eKeys Key); }; class cMenuMain : public cOsdMenu { private: bool replaying; cOsdItem *stopReplayItem; cOsdItem *cancelEditingItem; cOsdItem *stopRecordingItem; int recordControlsState; static cOsdObject *pluginOsdObject; void Set(void); bool Update(bool Force = false); public: cMenuMain(eOSState State = osUnknown, bool OpenSubMenus = false); virtual eOSState ProcessKey(eKeys Key); static cOsdObject *PluginOsdObject(void); }; class cDisplayChannel : public cOsdObject { private: cSkinDisplayChannel *displayChannel; int group; bool withInfo; cTimeMs lastTime; int number; bool timeout; int osdState; const cPositioner *positioner; const cChannel *channel; const cEvent *lastPresent; const cEvent *lastFollowing; static cDisplayChannel *currentDisplayChannel; void DisplayChannel(void); void DisplayInfo(void); void Refresh(void); const cChannel *NextAvailableChannel(const cChannel *Channel, int Direction); public: cDisplayChannel(int Number, bool Switched); cDisplayChannel(eKeys FirstKey); virtual ~cDisplayChannel(); virtual eOSState ProcessKey(eKeys Key); static bool IsOpen(void) { return currentDisplayChannel != NULL; } }; class cDisplayVolume : public cOsdObject { private: cSkinDisplayVolume *displayVolume; cTimeMs timeout; static cDisplayVolume *currentDisplayVolume; virtual void Show(void); cDisplayVolume(void); public: virtual ~cDisplayVolume(); static cDisplayVolume *Create(void); static void Process(eKeys Key); eOSState ProcessKey(eKeys Key); }; class cDisplayTracks : public cOsdObject { private: cSkinDisplayTracks *displayTracks; cTimeMs timeout; eTrackType types[ttMaxTrackTypes]; char *descriptions[ttMaxTrackTypes + 1]; // list is NULL terminated int numTracks, track, audioChannel; static cDisplayTracks *currentDisplayTracks; virtual void Show(void); cDisplayTracks(void); public: virtual ~cDisplayTracks(); static bool IsOpen(void) { return currentDisplayTracks != NULL; } static cDisplayTracks *Create(void); static void Process(eKeys Key); eOSState ProcessKey(eKeys Key); }; class cDisplaySubtitleTracks : public cOsdObject { private: cSkinDisplayTracks *displayTracks; cTimeMs timeout; eTrackType types[ttMaxTrackTypes]; char *descriptions[ttMaxTrackTypes + 1]; // list is NULL terminated int numTracks, track; static cDisplaySubtitleTracks *currentDisplayTracks; virtual void Show(void); cDisplaySubtitleTracks(void); public: virtual ~cDisplaySubtitleTracks(); static bool IsOpen(void) { return currentDisplayTracks != NULL; } static cDisplaySubtitleTracks *Create(void); static void Process(eKeys Key); eOSState ProcessKey(eKeys Key); }; cOsdObject *CamControl(void); bool CamMenuActive(void); class cRecordingFilter { public: virtual ~cRecordingFilter(void) {}; virtual bool Filter(const cRecording *Recording) const = 0; ///< Returns true if the given Recording shall be displayed in the Recordings menu. }; class cMenuRecordingItem; class cMenuRecordings : public cOsdMenu { private: char *base; int level; cStateKey recordingsStateKey; int helpKeys; const cRecordingFilter *filter; static cString path; static cString fileName; void SetHelpKeys(void); void Set(bool Refresh = false); bool Open(bool OpenSubMenus = false); eOSState Play(void); eOSState Rewind(void); eOSState Delete(void); eOSState Info(void); eOSState Sort(void); eOSState Commands(eKeys Key = kNone); protected: cString DirectoryName(void); public: cMenuRecordings(const char *Base = NULL, int Level = 0, bool OpenSubMenus = false, const cRecordingFilter *Filter = NULL); ~cMenuRecordings(); virtual eOSState ProcessKey(eKeys Key); static void SetPath(const char *Path); static void SetRecording(const char *FileName); }; class cRecordControl { private: cDevice *device; cTimer *timer; cRecorder *recorder; const cEvent *event; cString instantId; char *fileName; bool GetEvent(void); public: cRecordControl(cDevice *Device, cTimers *Timers, cTimer *Timer = NULL, bool Pause = false); virtual ~cRecordControl(); bool Process(time_t t); cDevice *Device(void) { return device; } void Stop(bool ExecuteUserCommand = true); const char *InstantId(void) { return instantId; } const char *FileName(void) { return fileName; } cTimer *Timer(void) { return timer; } }; class cRecordControls { private: static cRecordControl *RecordControls[]; static int state; public: static bool Start(cTimers *Timers, cTimer *Timer, bool Pause = false); static bool Start(bool Pause = false); static void Stop(const char *InstantId); static void Stop(cTimer *Timer); static bool PauseLiveVideo(void); static const char *GetInstantId(const char *LastInstantId); static cRecordControl *GetRecordControl(const char *FileName); static cRecordControl *GetRecordControl(const cTimer *Timer); ///< Returns the cRecordControl for the given Timer. ///< If there is no cRecordControl for Timer, NULL is returned. static bool Process(cTimers *Timers, time_t t); static void ChannelDataModified(const cChannel *Channel); static bool Active(void); static void Shutdown(void); static void ChangeState(void) { state++; } static bool StateChanged(int &State); }; class cAdaptiveSkipper { private: int *initialValue; int currentValue; double framesPerSecond; eKeys lastKey; cTimeMs timeout; public: cAdaptiveSkipper(void); void Initialize(int *InitialValue, double FramesPerSecond); int GetValue(eKeys Key); }; class cReplayControl : public cDvbPlayerControl { private: cSkinDisplayReplay *displayReplay; cAdaptiveSkipper adaptiveSkipper; cMarks marks; bool marksModified; bool visible, modeOnly, shown, displayFrames; int lastCurrent, lastTotal; bool lastPlay, lastForward; int lastSpeed; time_t timeoutShow; cTimeMs updateTimer; bool timeSearchActive, timeSearchHide; int timeSearchTime, timeSearchPos; void TimeSearchDisplay(void); void TimeSearchProcess(eKeys Key); void TimeSearch(void); void ShowTimed(int Seconds = 0); static cReplayControl *currentReplayControl; static cString fileName; void ShowMode(void); bool ShowProgress(bool Initial); void MarkToggle(void); void MarkJump(bool Forward); void MarkMove(int Frames, bool MarkRequired); void EditCut(void); void EditTest(void); public: cReplayControl(bool PauseLive = false); virtual ~cReplayControl(); void Stop(void); virtual cOsdObject *GetInfo(void); virtual const cRecording *GetRecording(void); virtual eOSState ProcessKey(eKeys Key); virtual void Show(void); virtual void Hide(void); bool Visible(void) { return visible; } virtual void ClearEditingMarks(void); static void SetRecording(const char *FileName); static const char *NowReplaying(void); static const char *LastReplayed(void); static void ClearLastReplayed(const char *FileName); }; #endif //__MENU_H