From a6d3a3d2a552e2846e8da5a03f7651c5c2e7d6b2 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Sun, 13 Nov 2005 18:25:34 +0000 Subject: [PATCH] move services in bouquets is now possible.. (bouquet save is missing yet) --- lib/dvb/db.cpp | 44 +++++++++++++++++++++++++++++++++- lib/dvb/db.h | 2 +- lib/dvb/idvb.h | 9 +++++-- lib/service/listboxservice.cpp | 30 +++++++++++++++++++++++ lib/service/servicedvb.cpp | 26 ++++++++++---------- 5 files changed, 93 insertions(+), 18 deletions(-) diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 70d512c1..a9329f18 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -10,6 +10,48 @@ DEFINE_REF(eDVBService); +// the following three methodes are declared in idvb.h +RESULT eBouquet::addService(const eServiceReference &ref) +{ + list::iterator it = + std::find(m_services.begin(), m_services.end(), ref); + if ( it != m_services.end() ) + return -1; + m_services.push_back(ref); + return 0; +} + +RESULT eBouquet::removeService(const eServiceReference &ref) +{ + list::iterator it = + std::find(m_services.begin(), m_services.end(), ref); + if ( it == m_services.end() ) + return -1; + m_services.erase(it); + return 0; +} + +RESULT eBouquet::moveService(const eServiceReference &ref, unsigned int pos) +{ + if ( pos < 0 || pos >= m_services.size() ) + return -1; + list::iterator source=m_services.end(); + list::iterator dest=m_services.end(); + for (list::iterator it(m_services.begin()); it != m_services.end(); ++it) + { + if (dest == m_services.end() && !pos--) + dest = it; + if (*it == ref) + source = it; + if (dest != m_services.end() && source != m_services.end()) + break; + } + if (dest == m_services.end() || source == m_services.end() || source == dest) + return -1; + std::iter_swap(source,dest); + return 0; +} + eDVBService::eDVBService() { } @@ -507,7 +549,7 @@ RESULT eDVBDB::getService(const eServiceReferenceDVB &reference, ePtr &query, eDVBChannelQuery *query, const eServiceReference &source); - RESULT getBouquet(const eServiceReference &ref, const eBouquet* &bouquet); + RESULT getBouquet(const eServiceReference &ref, eBouquet* &bouquet); }; // we have to add a possibility to invalidate here. diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index de481d7f..6b657119 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -19,7 +19,12 @@ struct eBouquet { std::string m_bouquet_name; std::string m_path; - std::list m_services; + typedef std::list list; + list m_services; +// the following three methods are implemented in db.cpp + RESULT addService(const eServiceReference &); + RESULT removeService(const eServiceReference &); + RESULT moveService(const eServiceReference &, unsigned int); }; // bitte KEINE operator int() definieren, sonst bringt das ganze nix! @@ -262,7 +267,7 @@ public: virtual RESULT addService(const eServiceReferenceDVB &service, eDVBService *service)=0; virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr &service)=0; - virtual RESULT getBouquet(const eServiceReference &ref, const eBouquet* &bouquet)=0; + virtual RESULT getBouquet(const eServiceReference &ref, eBouquet* &bouquet)=0; virtual RESULT startQuery(ePtr &query, eDVBChannelQuery *query, const eServiceReference &source)=0; }; diff --git a/lib/service/listboxservice.cpp b/lib/service/listboxservice.cpp index f413f2e2..19ff6933 100644 --- a/lib/service/listboxservice.cpp +++ b/lib/service/listboxservice.cpp @@ -155,7 +155,37 @@ int eListboxServiceContent::setCurrentMarked(bool state) m_current_marked = state; if (state != prev && m_listbox) + { m_listbox->entryChanged(m_cursor_number); + if (!state) + { + ePtr lst; + if (m_service_center->list(m_root, lst)) + eDebug("no list available!"); + else + { + ePtr list; + if (lst->startEdit(list)) + eDebug("no editable list"); + else + { + eServiceReference ref; + getCurrent(ref); + if(!ref) + eDebug("no valid service selected"); + else + { + int pos = cursorGet(); + eDebugNoNewLine("move %s to %d ", ref.toString().c_str(), pos); + if (list->moveService(ref, cursorGet())) + eDebug("failed"); + else + eDebug("ok"); + } + } + } + } + } return 0; } diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 94833f44..b1c18a1d 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -66,7 +66,7 @@ RESULT eStaticServiceDVBBouquetInformation::getName(const eServiceReference &ref return err; } - const eBouquet *bouquet=0; + eBouquet *bouquet=0; if ((err = db->getBouquet(ref, bouquet)) != 0) { eDebug("eStaticServiceDVBBouquetInformation::getName failed.. getBouquet failed!"); @@ -280,10 +280,9 @@ RESULT eDVBServiceList::startEdit(ePtr &res) if (eDVBResourceManager::getInstance(resm) || resm->getChannelList(db)) return -1; - // FIXME! - if (db->getBouquet(m_parent, (const eBouquet*&)m_bouquet) != 0) + if (db->getBouquet(m_parent, m_bouquet) != 0) return -1; - + res = this; return 0; @@ -294,24 +293,23 @@ RESULT eDVBServiceList::startEdit(ePtr &res) RESULT eDVBServiceList::addService(eServiceReference &ref) { - ASSERT(m_bouquet); -// return m_bouquet->addService(ref); - return -1; + if (!m_bouquet) + return -1; + return m_bouquet->addService(ref); } RESULT eDVBServiceList::removeService(eServiceReference &ref) { - ASSERT(m_bouquet); -// return m_bouquet->removeService(ref); - return -1; + if (!m_bouquet) + return -1; + return m_bouquet->removeService(ref); } RESULT eDVBServiceList::moveService(eServiceReference &ref, int pos) { - ASSERT(m_bouquet); - -// return m_bouquet->moveService(ref, pos); - return -1; + if (!m_bouquet) + return -1; + return m_bouquet->moveService(ref, pos); } RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr &ptr) -- 2.30.2