diff options
author | wr61 <wr61@e10066b5-e1e2-0310-b819-94efdf66514b> | 2005-02-26 16:10:35 +0000 |
---|---|---|
committer | wr61 <wr61@e10066b5-e1e2-0310-b819-94efdf66514b> | 2005-02-26 16:10:35 +0000 |
commit | a1ac1f29cf9eab9dd3f7153ed1f9a181d5d23d77 (patch) | |
tree | 1bc9c9f35fea0f7a6af8a6190e7b932915789b51 | |
parent | 6efeb7fc51d8e049e48842e50f0a5ab9d584a2bf (diff) | |
download | vdr-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.c | 17 | ||||
-rw-r--r-- | mg_actions.c | 40 | ||||
-rw-r--r-- | mg_actions.h | 1 | ||||
-rw-r--r-- | mg_db.c | 1 | ||||
-rw-r--r-- | mg_order.c | 29 | ||||
-rw-r--r-- | mg_order.h | 5 | ||||
-rw-r--r-- | vdr_menu.c | 17 | ||||
-rw-r--r-- | vdr_menu.h | 1 |
8 files changed, 101 insertions, 10 deletions
@@ -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 @@ -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 (); @@ -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) @@ -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); @@ -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) @@ -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; }; |