diff options
Diffstat (limited to 'src/RecursiveMenuSetup.cpp')
-rw-r--r-- | src/RecursiveMenuSetup.cpp | 284 |
1 files changed, 99 insertions, 185 deletions
diff --git a/src/RecursiveMenuSetup.cpp b/src/RecursiveMenuSetup.cpp index 02d5a7e..b31d2d8 100644 --- a/src/RecursiveMenuSetup.cpp +++ b/src/RecursiveMenuSetup.cpp @@ -21,250 +21,164 @@ */ #include "RecursiveMenuSetup.h" -#include "menunode.h" -#include <string> -#include "commandmenunode.h" -#include "pluginmenunode.h" -#include "systemmenunode.h" -#include "submenunode.h" -#include "linemenunode.h" -#include <vdr/interface.h> +#include "SubMenuNode.h" +#include "MenuConfigurationRepository.h" +#include "MenuSetupItemsFactory.h" +#include "MenuEditMenusFactory.h" -using namespace std; - -class MenuSetupItemsFactory: IMenuNodeProcessor +RecursiveMenuSetup::RecursiveMenuSetup(MenuConfigurationRepository* menuConfigurationRepository, SubMenuNode* rootMenuNode) + :cOsdMenu(tr("Menu Configuration")), _menuConfigurationRepository(menuConfigurationRepository) { -private: - cOsdMenu* _osdMenu; - -public: - MenuSetupItemsFactory(cOsdMenu* osdMenu) - { - _osdMenu = osdMenu; - } - - void SetupItems(MenuNode& rootMenu) - { - for (MenuNodeList::iterator i = rootMenu.Childs()->begin(); i != rootMenu.Childs()->end(); i++) - { - (*i)->Process(this); - } - } - - // IMenuNodeProcessor - void ProcessSystemMenuNode(SystemMenuNode* node) - { - string text = "(C) " + node->Text(); - _osdMenu->Add(new cOsdItem(text.c_str())); - } - - void ProcessPluginMenuNode(PluginMenuNode* node) - { - string text = "(P) " + node->Title(); - _osdMenu->Add(new cOsdItem(text.c_str())); - } - - void ProcessSubMenuNode(SubMenuNode* node) + _moving = false; + if (rootMenuNode) { - string text = "(M) " + node->Text(); - _osdMenu->Add(new cOsdItem(text.c_str())); + _currentRootMenuNode = rootMenuNode; + _menuConfiguration = NULL; } - - void ProcessCommandMenuNode(CommandMenuNode* node) + else { - string text = "(S) " + node->Text(); - _osdMenu->Add(new cOsdItem(text.c_str())); + _currentRootMenuNode = _menuConfiguration = menuConfigurationRepository->Load()->Clone(); } - - void ProcessLineMenuNode(LineMenuNode* node) - { - string text = (string) "(L) " + "------------------"; - _osdMenu->Add(new cOsdItem(text.c_str())); - } -}; - -class MenuEditMenusFactory: IMenuNodeProcessor -{ -private: - cOsdMenu*& _menu; - -public: - static cOsdMenu* Create(MenuNode& menuNode) - { - cOsdMenu* menu = NULL; - MenuEditMenusFactory editMenusFactory(menu); - menuNode.Process(&editMenusFactory); - return menu; - } - - // IMenuNodeProcessor - void ProcessSystemMenuNode(SystemMenuNode* node) - { - _menu = new cOsdMenu("Edit System Menu Node"); - } - - void ProcessPluginMenuNode(PluginMenuNode* node) - { - _menu = new cOsdMenu("Edit Plugin Menu Node"); - } - - void ProcessSubMenuNode(SubMenuNode* node) - { - _menu = new cOsdMenu("Edit Sub Menu Node"); - } - - void ProcessCommandMenuNode(CommandMenuNode* node) - { - _menu = new cOsdMenu("Edit Command Menu Node"); - } - - void ProcessLineMenuNode(LineMenuNode* nod) - { - _menu = NULL; - } - -private: - MenuEditMenusFactory(cOsdMenu*& menu) - :_menu(menu) - { - } -}; - -RecursiveMenuSetup::RecursiveMenuSetup(MenuNode& rootMenu) - :cOsdMenu(tr("Menu Configuration")), _rootMenu(rootMenu) -{ - _moving = false; - CreateMenuItems(); - ShowHelp(); + CreateMenuItems(); + ShowHelp(); } RecursiveMenuSetup::~RecursiveMenuSetup() { + delete _menuConfiguration; } void RecursiveMenuSetup::CreateMenuItems() { - MenuSetupItemsFactory menuItemSetupFactory(this); - menuItemSetupFactory.SetupItems(_rootMenu); + MenuSetupItemsFactory menuItemSetupFactory(this); + menuItemSetupFactory.SetupItems(*_currentRootMenuNode); } eOSState RecursiveMenuSetup::ProcessKey(eKeys Key) { - - if (_moving && ((Key == kUp) || (Key == kDown))) - { - return MoveCurrentItem(Key == kUp); + // Catch keys that should not be processed by the base class + if (_moving) + { + if ((Key == kUp) || (Key == kDown)) + { + return MoveCurrentItem(Key == kUp); + } } - eOSState state = cOsdMenu::ProcessKey(Key); + // Process keys in base class + eOSState state = cOsdMenu::ProcessKey(Key); if(HasSubMenu()) { + return state; } + if ((state == osBack) || (state == osEnd)) + { + if (!_currentRootMenuNode->Parent()) + { + _menuConfigurationRepository->Save(*_currentRootMenuNode); + } + } + + // Process unprocessed keys if ((state == osUnknown) && SelectedItem()) { - switch(Key) + if (_moving) { - case kOk: - if (_moving) - { - StopMoving(); - return osContinue; - } - else - { - return ShowSubOrEditMenuForSelectedItem(); - } - break; - case kRed: - if (!_moving) StartMoving(); - break; - case kBlue: - return ShowEditMenuForSelectedItem(); - default: - break; + switch(Key) + { + case kOk: + StopMoving(); + return osContinue; + default: + break; + } + } + else + { + switch(Key) + { + case kOk: + return ShowEditMenuForSelectedItem(true); + case kRed: + StartMoving(); + break; + case kBlue: + return ShowEditMenuForSelectedItem(false); + default: + break; + } } } + return state; } void RecursiveMenuSetup::StartMoving() { - _moving = true; - SetStatus("Move with Up/Down and confirm with OK"); - SetHelp(NULL); + _moving = true; + SetStatus("Move with Up/Down and confirm with OK"); + SetHelp(NULL); } void RecursiveMenuSetup::StopMoving() { - _moving = false; - SetStatus(NULL); - ShowHelp(); + _moving = false; + SetStatus(NULL); + ShowHelp(); } eOSState RecursiveMenuSetup::MoveCurrentItem(bool moveUp) { - int oldPos = Current(); - int newPos = Current(); + int oldPos = Current(); + int newPos = Current(); - MenuNode* node = _rootMenu.Childs()->at(oldPos); + MenuNode* node = _currentRootMenuNode->Childs()->at(oldPos); - if ((oldPos > 0) && (oldPos < Count())) - { - if (moveUp) - { - newPos = oldPos - 1; - } - else - { - newPos = oldPos + 1; - } + if ((oldPos > 0) && moveUp) + { + newPos = oldPos - 1; + } + else if ((oldPos < Count() - 1) && !moveUp) + { + newPos = oldPos + 1; + } - _rootMenu.Childs()->erase(_rootMenu.Childs()->begin() + oldPos); - _rootMenu.Childs()->insert(_rootMenu.Childs()->begin() + newPos, node); + if (oldPos != newPos) + { + _currentRootMenuNode->Childs()->erase(_currentRootMenuNode->Childs()->begin() + oldPos); + _currentRootMenuNode->Childs()->insert(_currentRootMenuNode->Childs()->begin() + newPos, node); - Clear(); - CreateMenuItems(); - SetCurrent(Get(newPos)); - Display(); + Clear(); + CreateMenuItems(); + SetCurrent(Get(newPos)); + Display(); } - return osContinue; + return osContinue; } void RecursiveMenuSetup::ShowHelp() { - SetHelp("Move", "Delete", "New", "Edit"); + SetHelp("Move", "Delete", "New", "Edit"); } -eOSState RecursiveMenuSetup::ShowEditMenuForSelectedItem() +eOSState RecursiveMenuSetup::ShowEditMenuForSelectedItem(bool openSubmenuInsteadOfEditing) { - cOsdMenu* editMenu = MenuEditMenusFactory::Create(*SelectedItem()); - if (editMenu) - { - return AddSubMenu(editMenu); - } - else - { - return osContinue; - } + cOsdMenu* editMenu = MenuEditMenusFactory::Create(*SelectedItem(), openSubmenuInsteadOfEditing); + if (editMenu) + { + return AddSubMenu(editMenu); + } + else + { + return osContinue; + } } MenuNode* RecursiveMenuSetup::SelectedItem() { - return _rootMenu.Childs()->at(Current()); -} - -eOSState RecursiveMenuSetup::ShowSubOrEditMenuForSelectedItem() -{ - if (!SelectedItem()->IsLeaf()) - { - return AddSubMenu(new RecursiveMenuSetup(*SelectedItem())); - } - else - { - return ShowEditMenuForSelectedItem(); - } + return _currentRootMenuNode->Childs()->at(Current()); } |