summaryrefslogtreecommitdiff
path: root/src/RecursiveMenuSetup.cpp
diff options
context:
space:
mode:
authorsvntobi <svntobi@cd0d6b48-d4f9-0310-940f-ab8c4eb44d3f>2007-09-09 23:51:48 +0000
committersvntobi <svntobi@cd0d6b48-d4f9-0310-940f-ab8c4eb44d3f>2007-09-09 23:51:48 +0000
commit54a81935b17db6a192e51ccbb0c0521dc58ee282 (patch)
tree69e547754082a8e96da7370c6f4380da3d2da1d1 /src/RecursiveMenuSetup.cpp
parent3ec475ea9846e02414684de3b5943d7c3e7dd2ea (diff)
downloadvdr-plugin-menuorg-54a81935b17db6a192e51ccbb0c0521dc58ee282.tar.gz
vdr-plugin-menuorg-54a81935b17db6a192e51ccbb0c0521dc58ee282.tar.bz2
Changed a lot !!!
git-svn-id: file:///home/tobias/sandbox/vdr/--/vdr-pkg/vdr-pkg/menuorg/trunk@6139 cd0d6b48-d4f9-0310-940f-ab8c4eb44d3f
Diffstat (limited to 'src/RecursiveMenuSetup.cpp')
-rw-r--r--src/RecursiveMenuSetup.cpp284
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());
}