summaryrefslogtreecommitdiff
path: root/vdr_menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'vdr_menu.c')
-rw-r--r--vdr_menu.c373
1 files changed, 277 insertions, 96 deletions
diff --git a/vdr_menu.c b/vdr_menu.c
index e3db994..e7e107b 100644
--- a/vdr_menu.c
+++ b/vdr_menu.c
@@ -45,7 +45,8 @@ mgStatus::OsdCurrentItem(const char* Text)
mgAction * a = dynamic_cast<mgAction *>(i);
if (!a)
mgError("mgStatus::OsdCurrentItem expected an mgAction*");
- a->TryNotify();
+ if (a)
+ a->TryNotify();
}
void Play(mgSelection *sel,const bool select) {
@@ -82,6 +83,27 @@ mgMainMenu::PlayInstant(const bool select)
}
void
+mgMainMenu::setOrder(mgSelection *sel,unsigned int idx)
+{
+ mgOrder* o = getOrder(idx);
+ if (o->size()>0)
+ {
+ m_current_order = idx;
+ sel->setOrder(o);
+ }
+ else
+ mgWarning("mgMainMenu::setOrder: orders[%u] is empty",idx);
+}
+
+mgOrder* mgMainMenu::getOrder(unsigned int idx)
+{
+ if (idx>=orders.size())
+ mgError("mgMainMenu::getOrder(%u): orders.size() is %d",
+ idx,orders.size());
+ return orders[idx];
+}
+
+void
mgMainMenu::CollectionChanged(string name)
{
delete moveselection;
@@ -151,7 +173,7 @@ mgMenu::GenerateAction(const mgActions action,mgActions on)
return result;
}
-void
+eOSState
mgMenu::ExecuteAction(const mgActions action,mgActions on)
{
mgAction *a = GenerateAction (action,on);
@@ -159,7 +181,9 @@ mgMenu::ExecuteAction(const mgActions action,mgActions on)
{
a->Execute ();
delete a;
+ return osContinue;
}
+ return osUnknown;
}
@@ -178,19 +202,42 @@ PlayerControl ()
mgMenu::mgMenu ()
{
m_osd = NULL;
- TreeRedAction = mgActions(0);
- TreeGreenAction = mgActions(0);
- TreeYellowAction = mgActions(0);
- CollRedAction = mgActions(0);
- CollGreenAction = mgActions(0);
- CollYellowAction = mgActions(0);
+ m_parent_index=-1;
+ TreeRedAction = actNone;
+ TreeGreenAction = actNone;
+ TreeYellowAction = actNone;
+ TreeBlueAction = actNone;
+ CollRedAction = actNone;
+ CollGreenAction = actNone;
+ CollYellowAction = actNone;
+ CollBlueAction = actNone;
}
// ----------------------- mgMainMenu ----------------------
-void mgMainMenu::SaveState()
+void
+mgMainMenu::DumpOrders(mgValmap& nv)
+{
+ map<string,mgOrder*>::iterator it;
+ for (unsigned int idx=0;idx<orders.size();idx++)
+ {
+ mgOrder *o = orders[idx];
+ if (!o)
+ mgError("DumpOrders:order[%u] is 0",idx);
+ char *n;
+ for (unsigned int i=0;i<o->size();i++)
+ {
+ asprintf(&n,"order%u.Keys.%d.Type",idx,i);
+ nv.put(n,int(o->Key(i)->Type()));
+ free(n);
+ }
+ }
+}
+
+void
+mgMainMenu::SaveState()
{
char *b;
asprintf(&b,"%s/muggle.state",cPlugin::ConfigDirectory ("muggle"));
@@ -206,6 +253,8 @@ void mgMainMenu::SaveState()
nmain.put("CollRedAction",int(Menus.front()->CollRedAction));
nmain.put("CollGreenAction",int(Menus.front()->CollGreenAction));
nmain.put("CollYellowAction",int(Menus.front()->CollYellowAction));
+ nmain.put("CurrentOrder",m_current_order);
+ DumpOrders(nmain);
mgValmap nsel("tree");
m_treesel.DumpState(nsel);
mgValmap ncol("collection");
@@ -216,7 +265,7 @@ void mgMainMenu::SaveState()
fclose(f);
}
-mgMainMenu::mgMainMenu ():cOsdMenu ("")
+mgMainMenu::mgMainMenu ():cOsdMenu ("",25)
{
m_Status = new mgStatus(this);
m_message = NULL;
@@ -230,11 +279,7 @@ mgMainMenu::mgMainMenu ():cOsdMenu ("")
mgValmap nmain("MainMenu");
// define defaults for values missing in state file:
- nsel.put("Keys.0.Choice",keyArtist);
- nsel.put("Keys.1.Choice",keyAlbum);
- nsel.put("Keys.2.Choice",keyTitle);
- ncol.put("Keys.0.Choice",keyCollection);
- ncol.put("Keys.1.Choice",keyCollectionItem);
+ nsel.put("FallThrough",true);
nmain.put("DefaultCollection",play_collection);
nmain.put("UsingCollection","false");
nmain.put("TreeRedAction",int(actAddThisToCollection));
@@ -257,21 +302,31 @@ mgMainMenu::mgMainMenu ():cOsdMenu ("")
}
// get values from mgValmaps
+ LoadOrders(nmain);
default_collection = nmain.getstr("DefaultCollection");
UsingCollection = nmain.getbool("UsingCollection");
InitMapFromSetup(nsel);
- m_treesel.InitFrom (nsel);
InitMapFromSetup(ncol);
+ m_treesel.setOrder(getOrder(m_current_order));
+ m_treesel.InitFrom (nsel);
+ m_treesel.CreateCollection(default_collection);
+ if (default_collection!=play_collection)
+ m_treesel.CreateCollection(play_collection);
+ vector<mgKeyTypes> kt;
+ kt.push_back(keyCollection);
+ mgOrder o;
+ o.setKeys(kt);
+ m_collectionsel.setOrder(&o);
m_collectionsel.InitFrom (ncol);
+ m_playsel.setOrder(&o);
m_playsel.InitFrom(ncol);
// initialize
- m_collectionsel.CreateCollection(default_collection);
- m_collectionsel.CreateCollection(play_collection);
- m_playsel.setKey(0,keyCollection);
- m_playsel.setKey(1,keyCollectionItem);
- m_playsel.leave(0);
- m_playsel.enter(play_collection);
+ if (m_playsel.level()!=1)
+ {
+ m_playsel.leave_all();
+ m_playsel.enter(play_collection);
+ }
UseNormalSelection ();
unsigned int posi = selection()->gotoPosition();
LoadExternalCommands(); // before AddMenu()
@@ -290,6 +345,57 @@ mgMainMenu::mgMainMenu ():cOsdMenu ("")
}
void
+mgMainMenu::AddOrder()
+{
+ orders.push_back(new mgOrder);
+}
+
+void
+mgMainMenu::DeleteOrder()
+{
+ orders.erase(orders.begin()+Current());
+}
+
+void
+mgMainMenu::LoadOrders(mgValmap& nv)
+{
+ for (unsigned int idx=0;idx<10;idx++)
+ {
+ char b[10];
+ sprintf(b,"order%u",idx);
+ mgOrder *o = new mgOrder(nv,b);
+ if (o->size()==0)
+ {
+ delete o;
+ continue;
+ }
+ orders.push_back(o);
+ }
+ m_current_order = nv.getuint("CurrentOrder");
+ if (m_current_order >= orders.size())
+ m_current_order=0;
+ if (orders.size()>0) return;
+
+ nv.put("order1.Keys.0.Type",keyArtist);
+ nv.put("order1.Keys.1.Type",keyAlbum);
+ nv.put("order1.Keys.2.Type",keyTrack);
+
+ nv.put("order2.Keys.0.Type",keyAlbum);
+ nv.put("order2.Keys.1.Type",keyTrack);
+
+ nv.put("order3.Keys.0.Type",keyGenres);
+ nv.put("order3.Keys.1.Type",keyArtist);
+ nv.put("order3.Keys.2.Type",keyAlbum);
+ nv.put("order3.Keys.3.Type",keyTrack);
+
+ nv.put("order4.Keys.0.Type",keyArtist);
+ nv.put("order4.Keys.1.Type",keyTrack);
+
+ nv.put("CurrentOrder",0);
+ LoadOrders(nv);
+}
+
+void
mgMainMenu::LoadExternalCommands()
{
// Read commands for collections in etc. /video/muggle/playlist_commands.conf
@@ -326,11 +432,7 @@ void
mgMainMenu::InitMapFromSetup (mgValmap& nv)
{
// values from setup override saved values
- nv["Host"] = the_setup.DbHost;
- nv["User"] = the_setup.DbUser;
- nv["Password"] = the_setup.DbPass;
nv["Directory"] = cPlugin::ConfigDirectory ("muggle");
- nv["ToplevelDir"] = the_setup.ToplevelDir;
}
void
@@ -353,13 +455,29 @@ mgMenu::AddAction (const mgActions action, mgActions on,const bool hotkey)
void
mgMenu::AddExternalAction(const mgActions action, const char *title)
{
- mgAction *a = GenerateAction(action,mgActions(0));
+ mgAction *a = GenerateAction(action,actNone);
if (!a) return;
a->SetText(osd()->hk(title));
osd()->AddItem(a);
}
void
+mgMainMenu::AddOrderActions(mgMenu* m)
+{
+ map<string,mgOrder*>::iterator it;
+ for (unsigned int idx=0;idx<orders.size();idx++)
+ {
+ mgOrder *o = orders[idx];
+ if (!o)
+ mgError("AddOrderAction:orders[%u] is 0",idx);
+ mgAction *a = m->GenerateAction(actOrder,actNone);
+ assert(a);
+ a->SetText(hk(o->Name().c_str()));
+ AddItem(a);
+ }
+}
+
+void
mgMenu::AddSelectionItems (mgSelection *sel,mgActions act)
{
for (unsigned int i = 0; i < sel->values.size (); i++)
@@ -371,7 +489,7 @@ mgMenu::AddSelectionItems (mgSelection *sel,mgActions act)
}
if (osd()->ShowingCollections ())
{
- mgAction *a = GenerateAction(actCreateCollection,mgActions(0));
+ mgAction *a = GenerateAction(actCreateCollection,actNone);
if (a)
{
a->SetText(a->MenuName(),false);
@@ -381,20 +499,6 @@ mgMenu::AddSelectionItems (mgSelection *sel,mgActions act)
}
-const char *
-mgMenu::BlueName (mgActions on)
-{
- // do not use typeid because we want to catch descendants too
- if (dynamic_cast<mgTreeCollSelector*>(this))
- return tr ("List");
- else if (osd()->Current()<0)
- return tr("Commands");
- else if (dynamic_cast<mgTree*>(this))
- return tr("Commands");
- else
- return tr ("List");
-}
-
const char*
mgMenu::HKey(const mgActions act,mgActions on)
{
@@ -411,23 +515,25 @@ mgMenu::HKey(const mgActions act,mgActions on)
void
mgMenu::SetHelpKeys(mgActions on)
{
- mgActions r,g,y;
+ mgActions r,g,y,b;
if (osd()->UsingCollection)
{
r = CollRedAction;
g = CollGreenAction;
y = CollYellowAction;
+ b = CollBlueAction;
}
else
{
r = TreeRedAction;
g = TreeGreenAction;
y = TreeYellowAction;
+ b = TreeBlueAction;
}
osd()->SetHelpKeys(HKey(r,on),
HKey(g,on),
HKey(y,on),
- BlueName(on));
+ HKey(b,on));
}
@@ -463,8 +569,7 @@ mgSubmenu::BuildOsd ()
snprintf(b,99,tr("Commands:%s"),trim(osd()->selection()->getCurrentValue()).c_str());
mgActions on = osd()->CurrentType();
InitOsd (b);
- mgMenu *p = osd ()->Parent ();
- if (!p)
+ if (!osd ()->Parent ())
return;
AddAction(actInstantPlay,on);
AddAction(actAddThisToCollection,on);
@@ -502,7 +607,7 @@ mgSubmenu::BuildOsd ()
mgActions
mgMainMenu::CurrentType()
{
- mgActions result = mgActions(0);
+ mgActions result = actNone;
cOsdItem* c = Get(Current());
if (c)
{
@@ -518,37 +623,36 @@ eOSState
mgMenu::ExecuteButton(eKeys key)
{
mgActions on = osd()->CurrentType();
- switch (key)
- {
- case kRed:
- if (osd()->UsingCollection)
- ExecuteAction (CollRedAction,on);
- else
- ExecuteAction (TreeRedAction,on);
- return osContinue;
- case kGreen:
- if (osd()->UsingCollection)
- ExecuteAction (CollGreenAction,on);
- else
- ExecuteAction (TreeGreenAction,on);
- return osContinue;
- case kYellow:
- if (osd()->UsingCollection)
- ExecuteAction (CollYellowAction,on);
- else
- ExecuteAction (TreeYellowAction,on);
- return osContinue;
- case kBlue:
- osd()->newmenu = new mgSubmenu;
- return osContinue;
- default:
- break;
- }
- return osUnknown;
+ mgActions action = actNone;
+ if (osd()->UsingCollection)
+ switch (key)
+ {
+ case kRed: action = CollRedAction; break;
+ case kGreen: action = CollGreenAction; break;
+ case kYellow: action = CollYellowAction; break;
+ case kBlue: action = CollBlueAction; break;
+ default: break;
+ }
+ else
+ switch (key)
+ {
+ case kRed: action = TreeRedAction; break;
+ case kGreen: action = TreeGreenAction; break;
+ case kYellow: action = TreeYellowAction; break;
+ case kBlue: action = TreeBlueAction; break;
+ default: break;
+ }
+ return ExecuteAction(action,on);
+}
+
+mgTree::mgTree()
+{
+ TreeBlueAction = actShowCommands;
+ CollBlueAction = actShowCommands;
}
eOSState
-mgTree::Process (eKeys key)
+mgMenu::Process (eKeys key)
{
return ExecuteButton(key);
}
@@ -695,6 +799,7 @@ void
mgMainMenu::CloseMenu()
{
mgMenu* m = Menus.back();
+ if (newposition==-1) newposition = m->getParentIndex();
Menus.pop_back ();
delete m;
}
@@ -704,24 +809,32 @@ mgMainMenu::showMessage()
{
if (m_message)
{
+ showmessage(m_message);
+ free(m_message);
+ m_message = NULL;
+ }
+}
+
+void
+showmessage(const char * msg)
+{
#if VDRVERSNUM >= 10307
- Skins.Message (mtInfo, m_message,2);
+ Skins.Message (mtInfo, msg,2);
Skins.Flush ();
#else
- Interface->Status (m_message);
+ Interface->Status (msg);
Interface->Flush ();
#endif
- free(m_message);
- m_message = NULL;
- }
}
-
void
mgMainMenu::AddMenu (mgMenu * m,unsigned int position)
{
Menus.push_back (m);
m->setosd (this);
+ m->setParentIndex(Current());
+ if (Get(Current()))
+ m->setParentName(Get(Current())->Text());
m->Display (position);
}
@@ -732,25 +845,94 @@ mgMenu::setosd(mgMainMenu *osd)
m_prevUsingCollection = osd->UsingCollection;
}
-eOSState
-mgSubmenu::Process (eKeys key)
+mgSubmenu::mgSubmenu()
{
- return osUnknown;
+ TreeBlueAction = actShowList;
+ CollBlueAction = actShowList;
}
void
mgMenuOrders::BuildOsd ()
{
- InitOsd (tr ("Select an order"));
- AddAction(ActOrderCollItem);
- AddAction(ActOrderArtistAlbumTitle);
- AddAction(ActOrderArtistTitle);
- AddAction(ActOrderAlbumTitle);
- AddAction(ActOrderGenreYearTitle);
- AddAction(ActOrderGenreArtistAlbumTitle);
+ TreeRedAction = actEditOrder;
+ TreeGreenAction = actCreateOrder;
+ TreeYellowAction = actDeleteOrder;
+ InitOsd (tr ("Select an order"));
+ osd()->AddOrderActions(this);
+}
+
+mgMenuOrder::mgMenuOrder()
+{
+ m_order=0;
}
+mgMenuOrder::~mgMenuOrder()
+{
+ if (m_order)
+ delete m_order;
+}
+
+void
+mgMenuOrder::BuildOsd ()
+{
+ if (!m_order)
+ {
+ m_order = new mgOrder;
+ *m_order = *(osd()->getOrder(getParentIndex()));
+ }
+ InitOsd (m_order->Name().c_str());
+ m_keytypes.clear();
+ m_keytypes.reserve(mgKeyTypesNr+1);
+ m_keynames.clear();
+ m_keynames.reserve(50);
+ for (unsigned int i=0;i<m_order->size();i++)
+ {
+ unsigned int kt;
+ m_keynames.push_back(selection()->choices(m_order,i,&kt));
+ m_keytypes.push_back(kt);
+ char buf[20];
+ sprintf(buf,tr("Key %d"),i+1);
+ mgAction *a = actGenerateKeyItem(buf,(int*)&m_keytypes[i],m_keynames[i].size(),&m_keynames[i][0]);
+ a->SetMenu(this);
+ osd()->AddItem(a);
+ }
+}
+
+bool
+mgMenuOrder::ChangeOrder(eKeys key)
+{
+ vector <mgKeyTypes> newtypes;
+ newtypes.clear();
+ for (unsigned int i=0; i<m_keytypes.size();i++)
+ newtypes.push_back(ktValue(m_keynames[i][m_keytypes[i]]));
+ mgOrder n = mgOrder(newtypes);
+ bool result = !(n == *m_order);
+ *m_order = n;
+ if (result)
+ {
+ osd()->forcerefresh = true;
+ int np = osd()->Current();
+ if (key==kUp && np) np--;
+ if (key==kDown) np++;
+ osd()->newposition = np;
+ }
+ return result;
+}
+
+void
+mgMenuOrder::SaveOrder()
+{
+ *(osd()->getOrder(getParentIndex())) = *m_order;
+ osd()->SaveState();
+}
+
+
+mgTreeCollSelector::mgTreeCollSelector()
+{
+ TreeBlueAction = actShowList;
+ CollBlueAction = actShowList;
+}
mgTreeCollSelector::~mgTreeCollSelector()
{
@@ -763,10 +945,10 @@ mgTreeCollSelector::BuildOsd ()
osd()->UsingCollection = true;
mgSelection *coll = osd()->collselection();
InitOsd (m_title.c_str());
- coll->leave(0);
+ coll->leave_all();
coll->setPosition(osd()->default_collection);
AddSelectionItems (coll,coll_action());
- osd()->newposition = coll->gotoPosition(0);
+ osd()->newposition = coll->gotoPosition();
cOsdItem *c = osd()->Get(osd()->newposition);
mgAction *a = dynamic_cast<mgAction *>(c);
a->IgnoreNextEvent = true;
@@ -787,13 +969,12 @@ mgMainMenu::DisplayGoto (unsigned int select)
{
if (select >= 0)
{
+ if ((int)select>=Count())
+ select = Count() -1;
SetCurrent (Get (select));
RefreshCurrent ();
}
Display ();
-#if VDRVERSNUM >= 10307
- DisplayMenu()->SetTabs(25);
-#endif
}