diff options
-rw-r--r-- | src/submenu.cc | 3 | ||||
-rw-r--r-- | src/submenu.h | 10 | ||||
-rw-r--r-- | src/submenuprovider.cc | 80 | ||||
-rw-r--r-- | src/submenuprovider.h | 5 | ||||
-rwxr-xr-x | vdr-patch/opt-37_submenu.dpatch | 49 |
5 files changed, 83 insertions, 64 deletions
diff --git a/src/submenu.cc b/src/submenu.cc deleted file mode 100644 index d9c3ab7..0000000 --- a/src/submenu.cc +++ /dev/null @@ -1,3 +0,0 @@ -eOSState SubMenu::ProcessKey(eKeys Key) -{ -} diff --git a/src/submenu.h b/src/submenu.h deleted file mode 100644 index b26c47f..0000000 --- a/src/submenu.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef ___SUBMENU_H -#define ___SUBMENU_H - -class SubMenu : public cOsdMenu -{ - public: - virtual eOSState ProcessKey(eKeys Key); -}; - -#endif diff --git a/src/submenuprovider.cc b/src/submenuprovider.cc index ccbb3fc..0b5abde 100644 --- a/src/submenuprovider.cc +++ b/src/submenuprovider.cc @@ -1,32 +1,42 @@ #include "submenuprovider.h" #include <vdr/plugin.h> +SubMenuProvider::SubMenuProvider() +{ + _inSubMenu = false; +} + MainMenuItemsList* SubMenuProvider::MainMenuItems() { ResetMainMenuItemsList(); - - _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem("A custom sub menu", osUser1))); -// _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Schedule"), osSchedule))); -// _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Channels"), osChannels))); -// _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Timers"), osTimers))); -// _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Recordings"), osRecordings))); - - for (int i = 0; ; i++) { - cPlugin *p = cPluginManager::GetPlugin(i); - if (p) { - const char *item = p->MainMenuEntry(); - if (item) - _osdItems.push_back(MainMenuItem::CreatePluginMenuItem(item, i)); - } - else - break; - } - - _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Setup"), osSetup))); - - if (Commands.Count()) - _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Commands"), osCommands))); + if (_inSubMenu) + { + _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Schedule"), osSchedule))); + _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Channels"), osChannels))); + _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Timers"), osTimers))); + _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Recordings"), osRecordings))); + } + else + { + _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem("A custom sub menu", osUser1))); + _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem("Another custom sub menu", osContinue))); + for (int i = 0; ; i++) { + cPlugin *p = cPluginManager::GetPlugin(i); + if (p) { + const char *item = p->MainMenuEntry(); + if (item) + _osdItems.push_back(MainMenuItem::CreatePluginMenuItem(item, i)); + } + else + break; + } + + _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Setup"), osSetup))); + + if (Commands.Count()) + _osdItems.push_back(MainMenuItem::CreateCustomMenuItem(new cOsdItem(tr("Commands"), osCommands))); + } return &_osdItems; } @@ -40,17 +50,23 @@ void SubMenuProvider::ResetMainMenuItemsList() _osdItems.clear(); } -cOsdMenu* SubMenuProvider::OpenSubMenu(int mainMenuItemIndex) +void SubMenuProvider::EnterSubMenu(int mainMenuItemIndex) { - if (mainMenuItemIndex == 0) + if ((mainMenuItemIndex == 0) && !_inSubMenu) { - cOsdMenu* fooMenu = new cOsdMenu("Foo-Submenu"); - fooMenu->Add(new cOsdItem(tr("Schedule"), osSchedule)); - fooMenu->Add(new cOsdItem(tr("Channels"), osChannels)); - fooMenu->Add(new cOsdItem(tr("Timers"), osTimers)); - fooMenu->Add(new cOsdItem(tr("Recordings"), osRecordings)); - return fooMenu; + _inSubMenu = true; + } +} + +bool SubMenuProvider::LeaveSubMenu() +{ + if (_inSubMenu) + { + _inSubMenu = false; + return true; + } + else + { + return false; } - - return NULL; } diff --git a/src/submenuprovider.h b/src/submenuprovider.h index f15daf6..d4d73eb 100644 --- a/src/submenuprovider.h +++ b/src/submenuprovider.h @@ -9,10 +9,13 @@ class SubMenuProvider: public ISubMenuProvider { private: MainMenuItemsList _osdItems; + bool _inSubMenu; public: + SubMenuProvider(); virtual MainMenuItemsList* MainMenuItems(); - virtual cOsdMenu* OpenSubMenu(int mainMenuItemIndex); + virtual void EnterSubMenu(int mainMenuItemIndex); + virtual bool LeaveSubMenu(); private: void ResetMainMenuItemsList(); diff --git a/vdr-patch/opt-37_submenu.dpatch b/vdr-patch/opt-37_submenu.dpatch index 7435f64..d997b84 100755 --- a/vdr-patch/opt-37_submenu.dpatch +++ b/vdr-patch/opt-37_submenu.dpatch @@ -4,8 +4,8 @@ @DPATCH@ diff -urNad vdr-1.4.7~/Makefile vdr-1.4.7/Makefile ---- vdr-1.4.7~/Makefile 2007-07-22 15:14:29.000000000 +0200 -+++ vdr-1.4.7/Makefile 2007-07-22 15:14:30.000000000 +0200 +--- vdr-1.4.7~/Makefile 2007-07-22 18:07:09.000000000 +0200 ++++ vdr-1.4.7/Makefile 2007-07-22 18:07:09.000000000 +0200 @@ -38,7 +38,7 @@ lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\ receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o\ @@ -16,8 +16,8 @@ diff -urNad vdr-1.4.7~/Makefile vdr-1.4.7/Makefile OBJS += osdcontroller.o rcontroller.o dvbsub.o vdrttxtsubshooks.o diff -urNad vdr-1.4.7~/menu.c vdr-1.4.7/menu.c ---- vdr-1.4.7~/menu.c 2007-07-22 15:14:29.000000000 +0200 -+++ vdr-1.4.7/menu.c 2007-07-22 15:25:10.000000000 +0200 +--- vdr-1.4.7~/menu.c 2007-07-22 18:07:09.000000000 +0200 ++++ vdr-1.4.7/menu.c 2007-07-22 18:07:09.000000000 +0200 @@ -31,6 +31,7 @@ #include "vdrttxtsubshooks.h" #include "dvbsub.h" @@ -61,27 +61,39 @@ diff -urNad vdr-1.4.7~/menu.c vdr-1.4.7/menu.c Update(true); Display(); -@@ -3238,6 +3260,17 @@ +@@ -3238,6 +3260,29 @@ state = osEnd; } break; -+ case osUser1: { ++ case osBack: { + SubMenuPatch::ISubMenuProvider* subMenuProvider; + + if (cPluginManager::CallFirstService("SubMenuPatch-v0.1::SubMenuProvider", &subMenuProvider)) { -+ cOsdMenu* subMenu = subMenuProvider->OpenSubMenu(Current()); -+ if (subMenu) { -+ AddSubMenu(subMenu); -+ } -+ break; ++ bool leavingMenuSucceeded = subMenuProvider->LeaveSubMenu(); ++ Set(); ++ if (leavingMenuSucceeded) ++ return osContinue; ++ else ++ return osEnd; + } + } ++ break; ++ case osUser1: { ++ SubMenuPatch::ISubMenuProvider* subMenuProvider; ++ ++ if (cPluginManager::CallFirstService("SubMenuPatch-v0.1::SubMenuProvider", &subMenuProvider)) { ++ subMenuProvider->EnterSubMenu(Current()); ++ Set(); ++ return osContinue; ++ } ++ } ++ break; default: switch (Key) { case kRecord: case kRed: if (!HadSubMenu) diff -urNad vdr-1.4.7~/submenupatch.c vdr-1.4.7/submenupatch.c --- vdr-1.4.7~/submenupatch.c 1970-01-01 01:00:00.000000000 +0100 -+++ vdr-1.4.7/submenupatch.c 2007-07-22 15:14:30.000000000 +0200 ++++ vdr-1.4.7/submenupatch.c 2007-07-22 18:12:46.000000000 +0200 @@ -0,0 +1,75 @@ +/* + * vdr-submenu - A plugin for the Linux Video Disk Recorder @@ -101,7 +113,7 @@ diff -urNad vdr-1.4.7~/submenupatch.c vdr-1.4.7/submenupatch.c + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * -+ * $Id: $ ++ * $Id$ + * + */ + @@ -160,8 +172,8 @@ diff -urNad vdr-1.4.7~/submenupatch.c vdr-1.4.7/submenupatch.c +}; diff -urNad vdr-1.4.7~/submenupatch.h vdr-1.4.7/submenupatch.h --- vdr-1.4.7~/submenupatch.h 1970-01-01 01:00:00.000000000 +0100 -+++ vdr-1.4.7/submenupatch.h 2007-07-22 15:21:59.000000000 +0200 -@@ -0,0 +1,59 @@ ++++ vdr-1.4.7/submenupatch.h 2007-07-22 18:12:33.000000000 +0200 +@@ -0,0 +1,60 @@ +/* + * vdr-submenu - A plugin for the Linux Video Disk Recorder + * Copyright (c) 2007 Tobias Grimm <vdr@e-tobi.net> @@ -180,7 +192,7 @@ diff -urNad vdr-1.4.7~/submenupatch.h vdr-1.4.7/submenupatch.h + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * -+ * $Id: $ ++ * $Id$ + * + */ + @@ -202,8 +214,8 @@ diff -urNad vdr-1.4.7~/submenupatch.h vdr-1.4.7/submenupatch.h + public: + virtual ~MainMenuItem() {}; + virtual bool IsCustomMenuItem() = 0; -+ virtual bool IsPluginMenuItem() = 0; + virtual cOsdItem* CustomMenuItem() = 0; ++ virtual bool IsPluginMenuItem() = 0; + virtual const char* PluginMenuEntry() = 0; + virtual int PluginIndex() = 0; +}; @@ -215,7 +227,8 @@ diff -urNad vdr-1.4.7~/submenupatch.h vdr-1.4.7/submenupatch.h + public: + virtual ~ISubMenuProvider(); + virtual MainMenuItemsList* MainMenuItems() = 0; -+ virtual cOsdMenu* OpenSubMenu(int mainMenuItemIndex) = 0; ++ virtual void EnterSubMenu(int mainMenuItemIndex) = 0; ++ virtual bool LeaveSubMenu() = 0; +}; + +}; |