summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwr61 <wr61@e10066b5-e1e2-0310-b819-94efdf66514b>2005-03-05 13:08:45 +0000
committerwr61 <wr61@e10066b5-e1e2-0310-b819-94efdf66514b>2005-03-05 13:08:45 +0000
commit520054f413f83fe5f744aa902bc7c3625308526e (patch)
tree2d2cd15b67ad87f92cd373dbaa8d7db6ec8794f3
parent738ef430f27a20e48240dbfeb9ddfce8fa1d9b1a (diff)
downloadvdr-plugin-muggle-520054f413f83fe5f744aa902bc7c3625308526e.tar.gz
vdr-plugin-muggle-520054f413f83fe5f744aa902bc7c3625308526e.tar.bz2
allow more flexible ordering with keyCollection
git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/branches/0.1.3-wr@538 e10066b5-e1e2-0310-b819-94efdf66514b
-rw-r--r--mg_order.c81
-rw-r--r--mg_order.h7
-rw-r--r--mg_selection.c2
-rw-r--r--vdr_menu.c1
4 files changed, 29 insertions, 62 deletions
diff --git a/mg_order.c b/mg_order.c
index 699a559..26cf213 100644
--- a/mg_order.c
+++ b/mg_order.c
@@ -228,14 +228,6 @@ class mgKeyGenre3 : public mgKeyGenres
unsigned int genrelevel() const { return 3; }
};
-class mgKeyid3Genre : public mgKeyNormal {
- public:
- mgKeyid3Genre() : mgKeyNormal(keyid3Genre,"tracks","genre1") {};
- string map_idfield() const { return "id"; }
- string map_valuefield() const { return "id3genre"; }
- string map_valuetable() const { return "genre"; }
-};
-
string
mgKeyGenres::GenreClauses(mgmySql &db,bool orderby) const
{
@@ -607,9 +599,10 @@ mgReference::mgReference(string t1,string f1,string t2,string f2)
mgOrder::mgOrder()
{
- setKey (0,keyArtist);
- setKey (1,keyAlbum);
- setKey (2,keyTrack);
+ clear();
+ setKey (keyArtist);
+ setKey (keyAlbum);
+ setKey (keyTrack);
m_orderByCount = false;
}
@@ -627,7 +620,7 @@ mgOrder::Key(unsigned int idx) const
mgKey*&
mgOrder::operator[](unsigned int idx)
{
- assert(idx<Keys.size());
+ assert(idx<size());
return Keys[idx];
}
@@ -682,32 +675,11 @@ mgOrder::Name()
}
void
-mgOrder::setKey (const unsigned int level, const mgKeyTypes kt)
+mgOrder::setKey (const mgKeyTypes kt)
{
mgKey *newkey = ktGenerate(kt);
- if (level == 0 && kt == keyCollection)
- {
- clear ();
- Keys.push_back(newkey);
- Keys.push_back(ktGenerate(keyCollectionItem));
- return;
- }
- if (level == size ())
- {
- Keys.push_back(newkey);
- }
- else
- {
- if (level >= Keys.size())
- mgError("mgOrder::setKey(%u,%s): level greater than size() %u",
- level,ktName(kt),Keys.size());
- delete Keys[level];
- Keys[level] = newkey;
- }
-
-// clear values for this and following levels (needed for copy constructor)
- for (unsigned int i = level; i < Keys.size (); i++)
- Keys[i]->set ("",EMPTY);
+ if (newkey)
+ Keys.push_back(newkey);
}
mgOrder::mgOrder(mgValmap& nv,char *prefix)
@@ -716,14 +688,18 @@ mgOrder::mgOrder(mgValmap& nv,char *prefix)
asprintf(&idx,"%s.OrderByCount",prefix);
m_orderByCount = nv.getbool(idx);
free(idx);
+ clear();
for (unsigned int i = 0; i < 999 ; i++)
{
asprintf(&idx,"%s.Keys.%u.Type",prefix,i);
unsigned int v = nv.getuint(idx);
free(idx);
if (v==0) break;
- setKey (i,mgKeyTypes(v) );
+ mgDebug(1,"found %s:%d",idx,v);
+ setKey (mgKeyTypes(v) );
}
+ if (size()>0)
+ clean();
}
void
@@ -750,7 +726,7 @@ mgOrder::setKeys(vector<mgKeyTypes> kt)
{
clear();
for (unsigned int i=0;i<kt.size();i++)
- setKey(size(),kt[i]);
+ setKey(kt[i]);
clean();
}
@@ -776,19 +752,6 @@ mgOrder::getKeyId(unsigned int idx) const
return Keys[idx]->id();
}
-
-mgKey*
-mgOrder::find(const mgKeyTypes kt)
-{
- keyvector::iterator i;
- for (i = Keys.begin () ; i != Keys.end (); ++i)
- {
- if ((*i)->Type() == kt)
- return *i;
- }
- return 0;
-}
-
void
mgOrder::truncate(unsigned int i)
{
@@ -853,8 +816,7 @@ cleanagain:
goto cleanagain;
}
}
- bool IsCollection = size()==0 ? false : Keys[0]->Type()==keyCollection;
- if (!IsCollection && !is_unique)
+ if (!is_unique)
{
if (!album_found)
Keys.push_back(ktGenerate(keyAlbum));
@@ -863,15 +825,20 @@ cleanagain:
}
}
+bool
+mgOrder::isCollectionOrder() const
+{
+ return (size()==2
+ && (Keys[0]->Type()==keyCollection)
+ && (Keys[1]->Type()==keyCollectionItem));
+}
mgParts
mgOrder::Parts(mgmySql &db,unsigned int level,bool orderby) const
{
mgParts result;
result.orderByCount = m_orderByCount;
- mgKeyNormal *k0 = dynamic_cast<mgKeyNormal*>(Keys[0]);
- mgKeyTypes kt0 = k0->Type();
- if (level==0 && kt0==keyCollection)
+ if (level==0 && isCollectionOrder())
{
// sql command contributed by jarny
result.m_sql_select = string("select playlist.title,playlist.id, "
@@ -1002,7 +969,6 @@ ktGenerate(const mgKeyTypes kt)
case keyAlbum: result = new mgKeyAlbum;break;
case keyCreated: result = new mgKeyDate(kt,"tracks","created");break;
case keyModified: result = new mgKeyDate(kt,"tracks","modified");break;
- case keyid3Genre: result = new mgKeyid3Genre;break;
case keyCollection: result = new mgKeyCollection;break;
case keyCollectionItem: result = new mgKeyCollectionItem;break;
case keyLanguage: result = new mgKeyLanguage;break;
@@ -1033,7 +999,6 @@ ktName(const mgKeyTypes kt)
case keyAlbum: result = "Album";break;
case keyCreated: result = "Created";break;
case keyModified: result = "Modified";break;
- case keyid3Genre: result = "id3Genre";break;
case keyCollection: result = "Collection";break;
case keyCollectionItem: result = "Collection item";break;
case keyLanguage: result = "Language";break;
diff --git a/mg_order.h b/mg_order.h
index 4bc5482..18222e6 100644
--- a/mg_order.h
+++ b/mg_order.h
@@ -39,7 +39,6 @@ enum mgKeyTypes {
keyFolder4,
keyCreated,
keyModified,
- keyid3Genre,
keyCollection,
keyCollectionItem,
};
@@ -149,9 +148,7 @@ public:
void truncate(unsigned int i);
bool empty() const { return Keys.empty(); }
void clear();
- void clean();
mgKey* Key(unsigned int idx) const;
- mgKey* find(const mgKeyTypes kt) ;
mgKeyTypes getKeyType(unsigned int idx) const;
string getKeyValue(unsigned int idx) const;
string getKeyId(unsigned int idx) const;
@@ -161,8 +158,10 @@ public:
bool getOrderByCount() { return m_orderByCount; }
private:
bool m_orderByCount;
+ bool isCollectionOrder() const;
keyvector Keys;
- void setKey (const unsigned int level, const mgKeyTypes kt);
+ void setKey ( const mgKeyTypes kt);
+ void clean();
};
bool operator==(const mgOrder& a,const mgOrder&b); //! \brief compares only the order, not the current key values
diff --git a/mg_selection.c b/mg_selection.c
index 14e5c68..3656aa2 100644
--- a/mg_selection.c
+++ b/mg_selection.c
@@ -215,6 +215,8 @@ mgSelection::AddToCollection (const string Name)
string listid = m_db.sql_string (m_db.get_col0
("SELECT id FROM playlist WHERE title=" + m_db.sql_string (Name)));
unsigned int tracksize = getNumTracks ();
+ if (tracksize==0)
+ return 0;
// this code is rather complicated but works in a multi user
// environment:
diff --git a/vdr_menu.c b/vdr_menu.c
index 18c10e7..6472ad6 100644
--- a/vdr_menu.c
+++ b/vdr_menu.c
@@ -320,6 +320,7 @@ mgMainMenu::mgMainMenu ():cOsdMenu ("",25)
m_treesel->CreateCollection(play_collection);
vector<mgKeyTypes> kt;
kt.push_back(keyCollection);
+ kt.push_back(keyCollectionItem);
mgOrder o;
o.setKeys(kt);
m_collectionsel = new mgSelection;