summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY4
-rw-r--r--mg_menu.c62
-rw-r--r--mg_selection.c18
-rw-r--r--mg_selection.h2
-rw-r--r--po/de.po6
-rw-r--r--po/fr.po6
-rw-r--r--po/muggle.pot5
-rw-r--r--vdr_menu.c77
-rw-r--r--vdr_player.c34
9 files changed, 92 insertions, 122 deletions
diff --git a/HISTORY b/HISTORY
index 3716c1f..b735dcf 100644
--- a/HISTORY
+++ b/HISTORY
@@ -296,7 +296,7 @@ XXXXXXXXXX: Version 0.0.8-ALPHA
2008-01-04: Version 0.1.12-BETA
- Fix compilation and some compiler warnings.
- Fix build with FLAC++ >= 1.1.3.
-- Rename image_convert.sh to muggle-image-convert, install it in
+
"make install", make it a bit more robust.
2008-4-11: Version 0.2.0-BETA
@@ -344,3 +344,5 @@ XXXXXXXXXX: Version 0.0.8-ALPHA
finished. And the message "loading lyrics" will only appear after they have been
loaded. If you don't like it, update vdr or send me a patch.
- make the compile option USE_BITMAP work again on unmodified FF cards
+- make sure a displayed list is never empty by moving up in the tree if needed.
+ If the list is then still empty, display an item "Synchronize data base".
diff --git a/mg_menu.c b/mg_menu.c
index 9abc7e4..1d496ae 100644
--- a/mg_menu.c
+++ b/mg_menu.c
@@ -342,32 +342,7 @@ mgOsd::Message1(const char *msg, const string &arg) {
eOSState mgOsd::ProcessKey (eKeys key) {
eOSState result = osContinue;
- if (Menus.size()<1)
- mgError("mgOsd::ProcessKey: Menus is empty");
- newmenu = Menus.back(); // Default: Stay in current menu
- newposition = -1;
-
- {
- mgMenu * oldmenu = newmenu;
-
- // item specific key logic:
- result = cOsdMenu::ProcessKey (key);
-
- // mgMenu specific key logic:
- if (result == osUnknown)
- result = oldmenu->Process (key);
- }
- // catch osBack for empty OSD lists . This should only happen for playlistitems
- // (because if the list was empty, no mgActions::ProcessKey was ever called)
- if (result == osBack) {
- // do as if there was an entry
- mgAction *a = Menus.back()->GenerateAction(actEntry,actEntry);
- if (a) {
- result = a->Back();
- delete a;
- }
- }
- switch (key) {
+ switch (key) {
case kFastRew:
case kFastRew|k_Repeat:
case kFastFwd:
@@ -377,15 +352,41 @@ eOSState mgOsd::ProcessKey (eKeys key) {
case kPrev|k_Repeat:
case kNext:
case kNext|k_Repeat:
+ case kChanUp:
+ case kChanUp|k_Repeat:
+ case kChanDn:
+ case kChanDn|k_Repeat:
// case kStop: does hide the player osd, but the player is still there in limbo
case kPause: {
mgPlayerControl *c = PlayerControl();
- if (c) c->ProcessKey(key);
+ if (c) {
+ result=c->ProcessKey(key);
+ goto pr_exit;
+ }
break;
}
default:
break;
}
+ if (Menus.size()<1)
+ mgError("mgOsd::ProcessKey: Menus is empty");
+ newmenu = Menus.back(); // Default: Stay in current menu
+ newposition = -1;
+
+ {
+ mgMenu * oldmenu = newmenu;
+
+ // item specific key logic:
+ result = cOsdMenu::ProcessKey (key);
+
+ // mgMenu specific key logic:
+ if (result == osUnknown)
+ result = oldmenu->Process (key);
+ }
+ if (result == osBack) {
+ mgError("vdr_menu found osBack: Should never happen");
+ result=osUnknown;
+ }
// do nothing for unknown keys:
if (result == osUnknown)
goto pr_exit;
@@ -408,6 +409,11 @@ eOSState mgOsd::ProcessKey (eKeys key) {
if (forcerefresh) {
forcerefresh = false;
+ if (newposition<0) {
+ mgSelMenu*sm = dynamic_cast<mgSelMenu*>(this);
+ if (sm)
+ newposition = sm->selection()->gotoPosition();
+ }
Menus.back ()->Display ();
}
pr_exit:
@@ -458,7 +464,7 @@ mgOsd::AddMenu (mgMenu * m,int position) {
m->setParentName(Get(Current())->Text());
if (position<0) position=0;
newposition = position;
- m->Display ();
+// m->Display ();
}
void
diff --git a/mg_selection.c b/mg_selection.c
index ceb6aeb..dd729ee 100644
--- a/mg_selection.c
+++ b/mg_selection.c
@@ -9,6 +9,7 @@
*
*/
+
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>
@@ -23,11 +24,16 @@
#include "mg_item_gd.h"
+#define __STL_CONFIG_H
+#include <vdr/i18n.h>
+
#if VDRVERSNUM >= 10307
#include <vdr/interface.h>
#include <vdr/skins.h>
#endif
+
+
/*! \brief returns a random integer within some range
*/
unsigned int
@@ -422,7 +428,7 @@ string mgSelection::exportM3U () {
}
bool
-mgSelection::empty() {
+mgSelection::empty() const {
listitems.refresh();
return ( listitems.size () == 0);
}
@@ -464,12 +470,16 @@ unsigned int
mgSelection::gotoPosition () {
assert(m_level<ordersize());
listitems.refresh();
- if (listitems.size()==0 && m_level>0) {
+ while (listitems.size()==0 && m_level>0) {
if (m_level>0) {
DecLevel();
refreshValues();
}
- return 0;
+ if (listitems.size())
+ return 0;
+//TODO testen: DB loeschen, muggle starten:Darf keine leere Liste zeigen.
+//evtl einen Dummmy-Eintrag "Nichts gefunden" mit passender Action
+//danach in mg_menu das spezielle osBack entfernen - respektive assert machen
}
unsigned int itemsize = listitems.size();
if (itemsize==0)
@@ -568,6 +578,8 @@ mgSelection::getCompletedLength () const
string mgSelection::getListname () const
{
+ if (empty())
+ return tr("Database is empty");
list<string> st;
for (unsigned int i = 0; i < m_level; i++) {
string val=getKeyItem(i)->value();
diff --git a/mg_selection.h b/mg_selection.h
index cd48e83..f256dcd 100644
--- a/mg_selection.h
+++ b/mg_selection.h
@@ -202,7 +202,7 @@ class mgSelection
}
//! \brief true if the selection holds no items
- bool empty();
+ bool empty() const;
/*! \brief returns detailed info about all selected items.
* The ordering is done only by the keyfield of the current level.
diff --git a/po/de.po b/po/de.po
index 999f731..75cc974 100644
--- a/po/de.po
+++ b/po/de.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: de\n"
"Report-Msgid-Bugs-To: <vdr-muggle-develop@sourceforge.net>\n"
-"POT-Creation-Date: 2008-04-11 19:35+0200\n"
+"POT-Creation-Date: 2008-04-15 03:21+0200\n"
"PO-Revision-Date: 2008-04-11 19:38+0200\n"
"Last-Translator: Wolfgang Rohdewald <wolfgang@rohdewald.de>\n"
"Language-Team: deutsch <vdr-muggle-i18n@sourceforge.net>\n"
@@ -37,6 +37,9 @@ msgstr "Datei %s nicht gefunden"
msgid "Commands"
msgstr "Befehle"
+msgid "Database is empty"
+msgstr ""
+
msgid "Genre"
msgstr "Stil"
@@ -373,4 +376,3 @@ msgstr "Setup.muggle$Transparenz für Cover"
msgid "Delete stale references"
msgstr "Einträge löschen, wenn Datei fehlt"
-
diff --git a/po/fr.po b/po/fr.po
index ba6e5e7..37bf6b6 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: fr\n"
"Report-Msgid-Bugs-To: <vdr-muggle-develop@sourceforge.net>\n"
-"POT-Creation-Date: 2008-04-11 19:35+0200\n"
+"POT-Creation-Date: 2008-04-15 03:21+0200\n"
"PO-Revision-Date: 2008-04-11 20:27+0200\n"
"Last-Translator: Wolfgang Rohdewald <wolfgang@rohdewald.de>\n"
"Language-Team: deutsch <vdr-muggle-i18n@sourceforge.net>\n"
@@ -36,6 +36,9 @@ msgstr "Fichier %s pas trouvé"
msgid "Commands"
msgstr "Commandes"
+msgid "Database is empty"
+msgstr ""
+
msgid "Genre"
msgstr "Genre"
@@ -372,4 +375,3 @@ msgstr "Setup.muggle$Transparancy de l'image"
msgid "Delete stale references"
msgstr "Effacer références éventées"
-
diff --git a/po/muggle.pot b/po/muggle.pot
index 8f57265..2c10cac 100644
--- a/po/muggle.pot
+++ b/po/muggle.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: <vdr-muggle-develop@sourceforge.net>\n"
-"POT-Creation-Date: 2008-04-13 09:27+0200\n"
+"POT-Creation-Date: 2008-04-15 07:37+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -33,6 +33,9 @@ msgstr ""
msgid "Commands"
msgstr ""
+msgid "Database is empty"
+msgstr ""
+
msgid "Genre"
msgstr ""
diff --git a/vdr_menu.c b/vdr_menu.c
index be8498e..8cfeac5 100644
--- a/vdr_menu.c
+++ b/vdr_menu.c
@@ -311,6 +311,7 @@ mgSelOsd::mgSelOsd () {
m_selroot->CollGreenAction = mgActions(nmain.getuint("CollGreenAction"));
m_selroot->CollYellowAction = mgActions(nmain.getuint("CollYellowAction"));
AddMenu (m_root,posi);
+ m_root->Display();
forcerefresh = false;
}
@@ -583,14 +584,12 @@ void
mgTree::BuildOsd () {
InitOsd (false);
AddSelectionItems (selection());
+ if (m_osd->Count()==0)
+ AddAction(actSync);
}
eOSState mgSelOsd::ProcessKey (eKeys key) {
- // TODO factor out to mgOsd
eOSState result = osContinue;
- if (Menus.size()<1)
- mgError("mgSelOsd::ProcessKey: Menus is empty");
-
mgPlayerControl * c = PlayerControl ();
if (c) {
if (!c->Playing ()) {
@@ -605,9 +604,6 @@ eOSState mgSelOsd::ProcessKey (eKeys key) {
}
else {
switch (key) {
- case kPause:
- c->Pause ();
- break;
case kStop:
if (instant_playing && queue_playing) {
PlayQueue();
@@ -617,12 +613,6 @@ eOSState mgSelOsd::ProcessKey (eKeys key) {
c->Stop ();
}
break;
- case kChanUp:
- c->Forward ();
- break;
- case kChanDn:
- c->Backward ();
- break;
default:
goto otherkeys;
}
@@ -635,58 +625,8 @@ eOSState mgSelOsd::ProcessKey (eKeys key) {
goto pr_exit;
}
otherkeys:
- newmenu = Menus.back(); // Default: Stay in current menu
- newposition = -1;
-
- {
- mgMenu * oldmenu = newmenu;
-
- // item specific key logic:
- result = cOsdMenu::ProcessKey (key);
-
- // mgMenu specific key logic:
- if (result == osUnknown)
- result = oldmenu->Process (key);
- }
- // catch osBack for empty OSD lists . This should only happen for playlistitems
- // (because if the list was empty, no mgActions::ProcessKey was ever called)
- if (result == osBack) {
- // do as if there was an entry
- mgAction *a = Menus.back()->GenerateAction(actEntry,actEntry);
- if (a) {
- result = a->Back();
- delete a;
- }
- }
-
- // do nothing for unknown keys:
- if (result == osUnknown)
- goto pr_exit;
-
- // change OSD menu as requested:
- if (newmenu == NULL) {
- if (Menus.size () > 1) {
- CloseMenu();
- forcerefresh = true;
- }
- else {
- result = osBack; // game over
- goto pr_exit;
- }
- }
- else if (newmenu != Menus.back ())
- AddMenu (newmenu,newposition);
-
forcerefresh |= selection()->cacheIsEmpty();
-
- forcerefresh |= (newposition>=0);
-
- if (forcerefresh) {
- forcerefresh = false;
- if (newposition<0)
- newposition = selection()->gotoPosition();
- Menus.back ()->Display ();
- }
+ return mgOsd::ProcessKey(key);
pr_exit:
showMessage();
return result;
@@ -706,15 +646,8 @@ showimportcount(unsigned int impcount,bool final=false) {
void
mgSelOsd::AddMenu (mgMenu * m,int position) {
- // TODO zwischen mgSelOsd und mgOsd auseinanderdividieren
- Menus.push_back (m);
selection()->Activate();
- m->setosd (this);
- m->setParentIndex(Current());
- if (Get(Current()))
- m->setParentName(Get(Current())->Text());
- newposition = position;
- m->Display ();
+ mgOsd::AddMenu(m,position);
}
void
diff --git a/vdr_player.c b/vdr_player.c
index 474717e..a9f1f7c 100644
--- a/vdr_player.c
+++ b/vdr_player.c
@@ -363,7 +363,7 @@ mgPlayerControl::InitLayout(void) {
InfoBottom = PBTop - 1;
int imagex1,imagey1,imagex2,imagey2;
listdepth=4;
- if (the_setup.BackgrMode==1) {
+ if (the_setup.BackgrMode==BackgroundCoverSmall) {
CoverWidth = PBBottom-lh;
while (1) {
CoverX = osdwidth - CoverWidth -3*fw -2;
@@ -383,7 +383,7 @@ mgPlayerControl::InitLayout(void) {
else
CoverWidth--;
}
- } else if (the_setup.BackgrMode==2) {
+ } else if (the_setup.BackgrMode==BackgroundCoverBig) {
CoverWidth=0;
CoverX = osdwidth;
CoverX /=4;
@@ -598,7 +598,10 @@ void
mgPlayerControl::ShowProgress (bool open) {
CheckImage();
int current_frame, total_frames;
- player->GetIndex (current_frame, total_frames);
+ if (player)
+ player->GetIndex (current_frame, total_frames);
+ else
+ current_frame=total_frames=0;
if (!osd) {
osd=cOsdProvider::NewOsd(Setup.OSDLeft, Setup.OSDTop,50);
if (!osd) return;
@@ -665,7 +668,7 @@ mgPlayerControl::ShowProgress (bool open) {
}
currItem=CurrentItem();
- currPos=player->Position();
+ currPos=player?player->Position():0;
bool changed=(prevItem != currItem);
char buf[256];
@@ -731,7 +734,7 @@ mgPlayerControl::ShowProgress (bool open) {
flush=true;
}
- switch(player->PlayMode()) {
+ switch(player?player->PlayMode():pmStopped) {
case pmStopped:
osd->DrawBitmap(osdwidth - 3*fw - 160, fh , bmStop, clrTopItemActiveFG, clrTopItemBG1);
osd->DrawBitmap(osdwidth - 3*fw - 130, fh , bmPlay, clrTopItemInactiveFG, clrTopItemBG1);
@@ -903,7 +906,7 @@ mgPlayerControl::Scroll(int by) {
int listsize=PlayList()->items().size();
if (ScrollPosition<0)
- ScrollPosition=player->Position();
+ ScrollPosition=player?player->Position():0;
ScrollPosition += by;
if (ScrollPosition<0) ScrollPosition=0;
if (ScrollPosition>listsize-1)
@@ -916,6 +919,7 @@ mgPlayerControl::ShowCommandMenu() {
cmdOsd = new mgPlayOsd;
cmdMenu = new mgPlayerCommands;
cmdOsd->AddMenu(cmdMenu);
+ cmdMenu->Display();
cmdOsd->Display();
}
@@ -933,23 +937,27 @@ eOSState mgPlayerControl::ProcessKey(eKeys Key) {
switch(Key) {
case kFastRew:
case kFastRew|k_Repeat:
- player->SkipSeconds(-the_setup.Jumptime);
+ SkipSeconds(-the_setup.Jumptime);
skiprew=1;
return osContinue;
case kFastFwd:
case kFastFwd|k_Repeat:
skipfwd=1;
- player->SkipSeconds(the_setup.Jumptime);
+ SkipSeconds(the_setup.Jumptime);
return osContinue;
case kPlay:
- player->Play();
+ Play();
return osContinue;
case kPrev:
case kPrev|k_Repeat:
+ case kChanDn:
+ case kChanDn|k_Repeat:
Backward();
return osContinue;
case kNext:
case kNext|k_Repeat:
+ case kChanUp:
+ case kChanUp|k_Repeat:
Forward();
return osContinue;
case kPause:
@@ -972,7 +980,7 @@ eOSState mgPlayerControl::ProcessKey(eKeys Key) {
return osContinue;
}
- if (!player->Active()) return osEnd;
+ if (!Active()) return osEnd;
if (timecount>0) timecount--;
@@ -1135,7 +1143,7 @@ eOSState mgPlayerControl::ProcessKey(eKeys Key) {
case kBack:
if (ScrollPosition>=0) {
- ScrollPosition=player->Position();
+ ScrollPosition=player?player->Position():0;
Display();
}
@@ -1375,7 +1383,7 @@ void mgPlayerControl::JumpProcess(eKeys Key) {
case kFastFwd:
case kGreen:
case kYellow:
- player->SkipSeconds(jumpmm*d * ((Key==kGreen) ? -1:1));
+ SkipSeconds(jumpmm*d * ((Key==kGreen) ? -1:1));
// fall through
default:
jumpactive=false;
@@ -1421,6 +1429,8 @@ void
mgPlayerControl::CheckImage() {
if (!m_img_provider)
return;
+ if (!player)
+ return;
#ifdef USE_BITMAP
if (cmdOsd) return;
#endif