summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwr61 <wr61@e10066b5-e1e2-0310-b819-94efdf66514b>2005-02-26 16:10:35 +0000
committerwr61 <wr61@e10066b5-e1e2-0310-b819-94efdf66514b>2005-02-26 16:10:35 +0000
commita1ac1f29cf9eab9dd3f7153ed1f9a181d5d23d77 (patch)
tree1bc9c9f35fea0f7a6af8a6190e7b932915789b51
parent6efeb7fc51d8e049e48842e50f0a5ab9d584a2bf (diff)
downloadvdr-plugin-muggle-a1ac1f29cf9eab9dd3f7153ed1f9a181d5d23d77.tar.gz
vdr-plugin-muggle-a1ac1f29cf9eab9dd3f7153ed1f9a181d5d23d77.tar.bz2
order by count
git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/branches/0.1.3-wr@513 e10066b5-e1e2-0310-b819-94efdf66514b
-rw-r--r--i18n.c17
-rw-r--r--mg_actions.c40
-rw-r--r--mg_actions.h1
-rw-r--r--mg_db.c1
-rw-r--r--mg_order.c29
-rw-r--r--mg_order.h5
-rw-r--r--vdr_menu.c17
-rw-r--r--vdr_menu.h1
8 files changed, 101 insertions, 10 deletions
diff --git a/i18n.c b/i18n.c
index d40637e..872bacd 100644
--- a/i18n.c
+++ b/i18n.c
@@ -13,6 +13,23 @@ const tI18nPhrase Phrases[] =
{
{
+ "Sort by count",
+ "Nach Häufigkeit sortieren",
+ "", // TODO
+ "", // TODO
+ "", // TODO
+ "", // TODO
+ "Sort by count", // TODO
+ "", // TODO
+ "", // TODO
+ "", // TODO
+ "", // TODO
+ "", // TODO
+ "", // TODO
+ "", // TODO
+ "", // TODO
+ },
+ {
"Key %d",
"Schlüsselfeld %d",
"", // TODO
diff --git a/mg_actions.c b/mg_actions.c
index fcbf5ee..9adeb9a 100644
--- a/mg_actions.c
+++ b/mg_actions.c
@@ -87,6 +87,14 @@ class mgKeyItem : public mgAction, public cMenuEditStraItem
eOSState Process(eKeys key);
};
+class mgBoolItem: public mgAction, public cMenuEditBoolItem
+{
+ public:
+ mgBoolItem(const char *Name,int *Value) : cMenuEditBoolItem(Name, Value) {}
+ eOSState ProcessKey(eKeys key) { return mgAction::ProcessKey(key); }
+ eOSState Process(eKeys key);
+};
+
class mgDoCollEntry : public mgEntry
{
public:
@@ -1238,6 +1246,12 @@ actGenerateKeyItem(const char *Name, int *Value, int NumStrings, const char * co
}
mgAction*
+actGenerateBoolItem(const char *Name, int *Value)
+{
+ return new mgBoolItem(Name,Value);
+}
+
+mgAction*
actGenerate(const mgActions action)
{
mgAction * result = NULL;
@@ -1333,3 +1347,29 @@ mgKeyItem::Process(eKeys key)
return cMenuEditStraItem::ProcessKey(key);
}
+
+eOSState
+mgBoolItem::Process(eKeys key)
+{
+ mgMenuOrder *menu = dynamic_cast<mgMenuOrder*>(m);
+ if (key==kOk)
+ {
+ if (menu->ChangeOrder(key))
+ return osContinue;
+ else
+ {
+ menu->SaveOrder();
+ osd ()->newmenu = NULL;
+ return osContinue;
+ }
+ } else if (key==kBack)
+ {
+ osd ()->newmenu = NULL;
+ return osContinue;
+ }
+ if (key==kUp || key==kDown)
+ if (menu->ChangeOrder(key))
+ return osContinue;
+ return cMenuEditBoolItem::ProcessKey(key);
+}
+
diff --git a/mg_actions.h b/mg_actions.h
index 1763b15..e60fcdf 100644
--- a/mg_actions.h
+++ b/mg_actions.h
@@ -181,6 +181,7 @@ class mgActionWithIntValue: public mgAction
//! \brief generate an mgAction for action
mgAction* actGenerate(const mgActions action);
+mgAction* actGenerateBoolItem(const char *Name, int *Value);
mgAction* actGenerateKeyItem(const char *Name, int *Value, int NumStrings, const char * const * Strings);
#endif
diff --git a/mg_db.c b/mg_db.c
index e0227ec..99c4f35 100644
--- a/mg_db.c
+++ b/mg_db.c
@@ -932,7 +932,6 @@ mgSelection::refreshValues () const
return;
if (m_current_values.empty())
{
- mgOrder o1 = order;
mgParts p = order.Parts(m_level);
m_current_values = p.sql_select();
values.strings.clear ();
diff --git a/mg_order.c b/mg_order.c
index 484aaf3..1663d87 100644
--- a/mg_order.c
+++ b/mg_order.c
@@ -422,6 +422,7 @@ mgKeyNormal::set(string value, string id)
mgParts::mgParts()
{
m_sql_select="";
+ orderByCount = false;
}
mgParts::~mgParts()
@@ -583,7 +584,7 @@ mgParts::sql_select(bool distinct)
string result;
if (distinct)
{
- fields.push_back("COUNT(*)");
+ fields.push_back("COUNT(*) AS mgcount");
result = sql_list("SELECT",fields);
fields.pop_back();
}
@@ -594,7 +595,11 @@ mgParts::sql_select(bool distinct)
result += sql_list("FROM",tables);
result += sql_list("WHERE",clauses," AND ");
if (distinct)
+ {
result += sql_list("GROUP BY",fields);
+ if (orderByCount)
+ orders.insert(orders.begin(),"mgcount desc");
+ }
result += sql_list("ORDER BY",orders);
optimize(result);
return result;
@@ -670,6 +675,7 @@ mgOrder::mgOrder()
setKey (0,keyArtist);
setKey (1,keyAlbum);
setKey (2,keyTrack);
+ m_orderByCount = false;
}
mgOrder::~mgOrder()
@@ -726,6 +732,7 @@ mgOrder::InitFrom(const mgOrder &from)
Keys.push_back(k);
}
if (from.m_db) setDB(from.m_db);
+ m_orderByCount=from.m_orderByCount;
}
string
@@ -771,10 +778,13 @@ mgOrder::setKey (const unsigned int level, const mgKeyTypes kt)
mgOrder::mgOrder(mgValmap& nv,char *prefix)
{
+ char *idx;
setDB(0);
+ asprintf(&idx,"%s.OrderByCount",prefix);
+ m_orderByCount = nv.getbool(idx);
+ free(idx);
for (unsigned int i = 0; i < 999 ; i++)
{
- char *idx;
asprintf(&idx,"%s.Keys.%u.Type",prefix,i);
unsigned int v = nv.getuint(idx);
free(idx);
@@ -783,8 +793,22 @@ mgOrder::mgOrder(mgValmap& nv,char *prefix)
}
}
+void
+mgOrder::DumpState(mgValmap& nv, char *prefix) const
+{
+ char n[100];
+ sprintf(n,"%s.OrderByCount",prefix);
+ nv.put(n,m_orderByCount);
+ for (unsigned int i=0;i<size();i++)
+ {
+ sprintf(n,"%s.Keys.%d.Type",prefix,i);
+ nv.put(n,int(Key(i)->Type()));
+ }
+}
+
mgOrder::mgOrder(vector<mgKeyTypes> kt)
{
+ m_orderByCount = false;
setDB(0);
setKeys(kt);
}
@@ -918,6 +942,7 @@ mgOrder::Parts(unsigned int level,bool orderby) const
{
assert(strlen(m_db->host));
mgParts result;
+ result.orderByCount = m_orderByCount;
mgKeyNormal *k0 = dynamic_cast<mgKeyNormal*>(Keys[0]);
mgKeyTypes kt0 = k0->Type();
if (level==0 && kt0==keyCollection)
diff --git a/mg_order.h b/mg_order.h
index aad9af3..51a7003 100644
--- a/mg_order.h
+++ b/mg_order.h
@@ -122,6 +122,7 @@ public:
string sql_update(strlist new_values);
bool empty() const { return tables.size()==0;}
string m_sql_select;
+ bool orderByCount;
private:
bool UsesTracks();
mgReferences ref;
@@ -151,6 +152,7 @@ public:
mgOrder(vector<mgKeyTypes> kt);
~mgOrder();
void InitFrom(const mgOrder &from);
+ void DumpState(mgValmap& nv, char *prefix) const;
void setDB(MYSQL *db);
mgParts Parts(unsigned int level,bool orderby=true) const;
const mgOrder& operator=(const mgOrder& from);
@@ -167,7 +169,10 @@ public:
string getKeyId(unsigned int idx) const;
void setKeys(vector<mgKeyTypes> kt);
string Name();
+ void setOrderByCount(bool orderbycount) { m_orderByCount = orderbycount;}
+ bool getOrderByCount() { return m_orderByCount; }
private:
+ bool m_orderByCount;
MYSQL *m_db;
keyvector Keys;
void setKey (const unsigned int level, const mgKeyTypes kt);
diff --git a/vdr_menu.c b/vdr_menu.c
index 4789eb3..3754924 100644
--- a/vdr_menu.c
+++ b/vdr_menu.c
@@ -225,13 +225,9 @@ mgMainMenu::DumpOrders(mgValmap& nv)
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);
- }
+ char prefix[20];
+ sprintf(prefix,"order%u",idx);
+ o->DumpState(nv,prefix);
}
}
@@ -910,6 +906,8 @@ mgMenuOrder::BuildOsd ()
m_keytypes.reserve(mgKeyTypesNr+1);
m_keynames.clear();
m_keynames.reserve(50);
+ m_orderbycount = m_order->getOrderByCount();
+ mgDebug(1,"m_orderbycount wird %d",m_orderbycount);
for (unsigned int i=0;i<m_order->size();i++)
{
unsigned int kt;
@@ -921,6 +919,9 @@ mgMenuOrder::BuildOsd ()
a->SetMenu(this);
osd()->AddItem(a);
}
+ mgAction *a = actGenerateBoolItem(tr("Sort by count"),&m_orderbycount);
+ a->SetMenu(this);
+ osd()->AddItem(a);
}
bool
@@ -931,6 +932,8 @@ mgMenuOrder::ChangeOrder(eKeys key)
for (unsigned int i=0; i<m_keytypes.size();i++)
newtypes.push_back(ktValue(m_keynames[i][m_keytypes[i]]));
mgOrder n = mgOrder(newtypes);
+ n.setOrderByCount(m_orderbycount);
+ mgDebug(1,"m_orderbycount %d nach n",m_orderbycount);
bool result = !(n == *m_order);
*m_order = n;
if (result)
diff --git a/vdr_menu.h b/vdr_menu.h
index f34c071..cba5a4d 100644
--- a/vdr_menu.h
+++ b/vdr_menu.h
@@ -375,6 +375,7 @@ class mgMenuOrder : public mgMenu
private:
void AddKeyActions(mgMenu *m,mgOrder *o);
mgOrder * m_order;
+ int m_orderbycount;
vector<int> m_keytypes;
vector < vector <const char*> > m_keynames;
};