<key id="KEY_BLUE" mapto="showFavourites" flags="m" />
<key id="KEY_CHANNELUP" mapto="nextBouquet" flags="m" />
<key id="KEY_CHANNELDOWN" mapto="prevBouquet" flags="m" />
+ <key id="KEY_PREVIOUS" mapto="prevMarker" flags="m" />
+ <key id="KEY_NEXT" mapto="nextMarker" flags="m" />
</map>
<map context="ChannelSelectEPGActions">
DEFINE_REF(eDVBService);
-RESULT eBouquet::addService(const eServiceReference &ref)
+RESULT eBouquet::addService(const eServiceReference &ref, eServiceReference before)
{
list::iterator it =
std::find(m_services.begin(), m_services.end(), ref);
if ( it != m_services.end() )
return -1;
- m_services.push_back(ref);
+ if (before.valid())
+ {
+ it = std::find(m_services.begin(), m_services.end(), before);
+ m_services.insert(it, ref);
+ }
+ else
+ m_services.push_back(ref);
return 0;
}
list m_services;
// the following five methods are implemented in db.cpp
RESULT flushChanges();
- RESULT addService(const eServiceReference &);
+ RESULT addService(const eServiceReference &, eServiceReference before=eServiceReference());
RESULT removeService(const eServiceReference &);
RESULT moveService(const eServiceReference &, unsigned int);
RESULT setListName(const std::string &name);
if pic:
self.l.setPixmap(self.l.picFolder, pic)
+ pic = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "marker-fs8.png"))
+ if pic:
+ self.l.setPixmap(self.l.picMarker, pic)
+
pic = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "ico_dvb_s-fs8.png"))
if pic:
self.l.setPixmap(self.l.picDVB_S, pic)
self.instance.moveSelectionTo(index)
print "Moving to character " + str(char)
+ def moveToNextMarker(self):
+ idx = self.l.getNextMarkerPos()
+ self.instance.moveSelectionTo(idx)
+
+ def moveToPrevMarker(self):
+ idx = self.l.getPrevMarkerPos()
+ self.instance.moveSelectionTo(idx)
+
def moveToIndex(self, index):
self.instance.moveSelectionTo(index)
if not justSet:
self.l.sort()
- def addService(self, service):
- self.l.addService(service)
+ def removeCurrent(self):
+ self.l.removeCurrent()
+
+ def addService(self, service, beforeCurrent=False):
+ self.l.addService(service, beforeCurrent)
def finishFill(self):
self.l.FillFinished()
if current_sel_path.find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
menu.append((_("remove all new found flags"), self.removeAllNewFoundFlags))
if inBouquet:
- menu.append((_("remove service"), self.removeCurrentService))
+ menu.append((_("remove entry"), self.removeCurrentService))
if current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
menu.append((_("remove new found flag"), self.removeNewFoundFlag))
-
- if haveBouquets:
- menu.append((_("add bouquet..."), self.showBouquetInputBox))
- if inBouquetRootList:
- menu.append((_("remove bouquet"), self.removeBouquet))
+ else:
+ menu.append((_("add bouquet"), self.showBouquetInputBox))
+ menu.append((_("remove entry"), self.removeBouquet))
if inBouquet: # current list is editable?
if not csel.bouquet_mark_edit:
if not csel.movemode:
+ menu.append((_("add marker"), self.showMarkerInputBox))
menu.append((_("enable move mode"), self.toggleMoveMode))
if not inBouquetRootList:
if haveBouquets:
def bouquetInputCallback(self, bouquet):
if bouquet is not None:
- self.csel.addBouquet(bouquet, None, True)
+ self.csel.addBouquet(bouquet, None)
+ self.close()
def addServiceToBouquetSelected(self):
bouquets = self.csel.getBouquetList()
self.csel.removeBouquet()
self.close()
+ def showMarkerInputBox(self):
+ self.session.openWithCallback(self.markerInputCallback, InputBox, title=_("Please enter a name for the new marker"), text="markername", maxSize=False, type=Input.TEXT)
+
+ def markerInputCallback(self, marker):
+ if marker is not None:
+ self.csel.addMarker(marker)
+ self.close()
+
def addCurrentServiceToBouquet(self, dest):
self.csel.addCurrentServiceToBouquet(dest)
if self.bsel is not None:
name += '_'
return name
- def addBouquet(self, bName, services, refresh=False):
+ def addMarker(self, name):
+ current = self.servicelist.getCurrent()
+ mutableList = self.getMutableList()
+ cnt = 0
+ while mutableList:
+ str = '1:64:%d:0:0:0:0:0:0:0::%s'%(cnt, name)
+ ref = eServiceReference(str)
+ if current and current.valid():
+ if not mutableList.addService(ref, current):
+ self.servicelist.addService(ref, True)
+ mutableList.flushChanges()
+ break
+ elif not mutableList.addService(ref):
+ self.servicelist.addService(ref, True)
+ mutableList.flushChanges()
+ break
+ cnt+=1
+
+ def addBouquet(self, bName, services):
serviceHandler = eServiceCenter.getInstance()
mutableBouquetList = serviceHandler.list(self.bouquet_root).startEdit()
if mutableBouquetList:
for service in services:
if mutableBouquet.addService(service):
print "add", service.toString(), "to new bouquet failed"
+ else:
+ current = self.servicelist.getCurrent()
+ if current and current.toString() == self.bouquet_rootstr:
+ self.servicelist.addService(service, True)
mutableBouquet.flushChanges()
- if refresh:
- self.setRoot(self.getRoot())
else:
print "get mutable list for new created bouquet failed"
else:
remove(filename)
except OSError:
print "error during remove of", filename
- eDVBDB.getInstance().reloadBouquets()
# multiple marked entry stuff ( edit mode, later multiepg selection )
def startMarkedEdit(self):
if not mutableList.removeService(ref):
self.bouquetNumOffsetCache = { }
mutableList.flushChanges() #FIXME dont flush on each single removed service
- self.setRoot(self.getRoot())
+ self.servicelist.removeCurrent()
def addCurrentServiceToBouquet(self, dest):
mutableList = self.getMutableList(dest)
"showSatellites": self.showSatellites,
"nextBouquet": self.nextBouquet,
"prevBouquet": self.prevBouquet,
+ "nextMarker": self.nextMarker,
+ "prevMarker": self.prevMarker,
"1": self.keyNumberGlobal,
"2": self.keyNumberGlobal,
"3": self.keyNumberGlobal,
else:
self.showAllServices()
+ def nextMarker(self):
+ self.servicelist.moveToNextMarker()
+
+ def prevMarker(self):
+ self.servicelist.moveToPrevMarker()
+
HISTORYSIZE = 20
#config for lastservice
self.enterPath(ref)
elif self.bouquet_mark_edit:
self.doMark()
- else:
+ elif not (ref.flags & 64): # no marker
self.zap()
self.close(ref)
self.enterPath(ref)
elif self.bouquet_mark_edit:
self.doMark()
- else:
+ elif not (ref.flags & 64): # no marker
playingref = self.session.nav.getCurrentlyPlayingServiceReference()
if playingref is None or playingref != ref:
self.session.nav.playService(ref)
ref = self.getCurrentSelection()
if (ref.flags & 7) == 7:
self.enterPath(ref)
- else:
+ elif not (ref.flags & 64):
ref = self.getCurrentSelection()
self.close(ref)
self.session.execDialog(self.servicelist)
def zapUp(self):
- if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes":
- if self.servicelist.inBouquet() and self.servicelist.atBegin():
- self.servicelist.prevBouquet()
- self.servicelist.moveUp()
+ if self.servicelist.inBouquet():
+ prev = self.servicelist.getCurrentSelection()
+ if prev:
+ prev = prev.toString()
+ while True:
+ if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes":
+ if self.servicelist.atBegin():
+ self.servicelist.prevBouquet()
+ self.servicelist.moveUp()
+ cur = self.servicelist.getCurrentSelection()
+ if not cur or (not (cur.flags & 64)) or cur.toString() == prev:
+ break
+ else:
+ self.servicelist.moveUp()
self.servicelist.zap()
self.doShow()
def zapDown(self):
- if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes" and self.servicelist.inBouquet() and self.servicelist.atEnd():
- self.servicelist.nextBouquet()
+ if self.servicelist.inBouquet():
+ prev = self.servicelist.getCurrentSelection()
+ if prev:
+ prev = prev.toString()
+ while True:
+ if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes":
+ if self.servicelist.atEnd():
+ self.servicelist.nextBouquet()
+ else:
+ self.servicelist.moveDown()
+ else:
+ self.servicelist.moveDown()
+ cur = self.servicelist.getCurrentSelection()
+ if not cur or (not (cur.flags & 64)) or cur.toString() == prev:
+ break
else:
self.servicelist.moveDown()
self.servicelist.zap()
flagDirectory=isDirectory|mustDescent|canDescent,
shouldSort=8, // should be ASCII-sorted according to service_name. great for directories.
hasSortKey=16, // has a sort key in data[3]. not having a sort key implies 0.
- sort1=32 // sort key is 1 instead of 0
+ sort1=32, // sort key is 1 instead of 0
+ isMarker=64 // Marker
};
int flags; // flags will NOT be compared.
/* flush changes */
virtual RESULT flushChanges()=0;
/* adds a service to a list */
- virtual RESULT addService(eServiceReference &ref)=0;
+ virtual RESULT addService(eServiceReference &ref, eServiceReference before=eServiceReference())=0;
/* removes a service from a list */
virtual RESULT removeService(eServiceReference &ref)=0;
/* moves a service in a list, only if list suppports a specific sort method. */
#include <lib/dvb/pmt.h>
#include <lib/python/connections.h>
-void eListboxServiceContent::addService(const eServiceReference &service)
+void eListboxServiceContent::addService(const eServiceReference &service, bool beforeCurrent)
{
- m_list.push_back(service);
+ if (beforeCurrent && m_size)
+ {
+ m_list.insert(m_cursor, service);
+ ++m_size;
+ --m_cursor;
+ }
+ else
+ m_list.push_back(service);
+}
+
+void eListboxServiceContent::removeCurrent()
+{
+ if (m_size && m_listbox)
+ {
+ if (m_cursor_number == m_size-1)
+ m_list.erase(m_cursor--);
+ else
+ m_list.erase(m_cursor++);
+ --m_size;
+ m_listbox->entryRemoved(m_cursor_number);
+ }
}
void eListboxServiceContent::FillFinished()
return 0;
}
+int eListboxServiceContent::getPrevMarkerPos()
+{
+ if (!m_listbox)
+ return 0;
+ list::iterator i(m_cursor);
+ int index = m_cursor_number;
+ while (index)
+ {
+ --i;
+ --index;
+ if (i->flags & eServiceReference::isMarker)
+ break;
+ }
+ return index;
+}
+
+int eListboxServiceContent::getNextMarkerPos()
+{
+ if (!m_listbox)
+ return 0;
+ list::iterator i(m_cursor);
+ int index = m_cursor_number;
+ while (index < (m_size-1))
+ {
+ ++i;
+ ++index;
+ if (i->flags & eServiceReference::isMarker)
+ break;
+ }
+ return index;
+}
+
void eListboxServiceContent::initMarked()
{
m_marked.clear();
if (m_is_playable_ignore.valid() && service_info && !service_info->isPlayable(*m_cursor, m_is_playable_ignore))
painter.setForegroundColor(gRGB(0xbbbbbb));
- int xoffset=0; // used as offset when painting the folder symbol
+ int xoffset=0; // used as offset when painting the folder/marker symbol
for (int e = 0; e < celElements; ++e)
{
{
case celServiceNumber:
{
+ if (m_cursor->flags & eServiceReference::isMarker)
+ continue;
char bla[10];
- sprintf(bla, "%d", m_numberoffset + m_cursor_number + 1);
+ /* how we can do this better? :) */
+ int markers_before=0;
+ {
+ list::iterator tmp=m_cursor;
+ while(tmp != m_list.begin())
+ {
+ --tmp;
+ if (tmp->flags & eServiceReference::isMarker)
+ ++markers_before;
+ }
+ }
+ sprintf(bla, "%d", m_numberoffset + m_cursor_number + 1 - markers_before);
text = bla;
flags|=gPainter::RT_HALIGN_RIGHT;
break;
painter.renderPara(para, offset+ePoint(xoffs, yoffs));
}
- else if (e == celServiceTypePixmap || e == celFolderPixmap)
+ else if (e == celServiceTypePixmap || e == celFolderPixmap || e == celMarkerPixmap)
{
int orbpos = m_cursor->getUnsignedData(4) >> 16;
ePtr<gPixmap> &pixmap =
(e == celFolderPixmap) ? m_pixmaps[picFolder] :
+ (e == celMarkerPixmap) ? m_pixmaps[picMarker] :
(orbpos == 0xFFFF) ? m_pixmaps[picDVB_C] :
(orbpos == 0xEEEE) ? m_pixmaps[picDVB_T] : m_pixmaps[picDVB_S];
if (pixmap)
{
eSize pixmap_size = pixmap->size();
- eRect area = m_element_position[e == celFolderPixmap ? celServiceName : celServiceInfo];
+ int p = celServiceInfo;
+ if (e == celFolderPixmap)
+ p = celServiceName;
+ else if (e == celMarkerPixmap)
+ p = celServiceNumber;
+ eRect area = m_element_position[p];
int correction = (area.height() - pixmap_size.height()) / 2;
if (m_cursor->flags & eServiceReference::flagDirectory)
continue;
xoffset = pixmap_size.width() + 8;
}
+ else if (m_cursor->flags & eServiceReference::isMarker)
+ {
+ if (e != celMarkerPixmap)
+ continue;
+ }
else
{
if (e != celServiceTypePixmap)
public:
eListboxServiceContent();
- void addService(const eServiceReference &ref);
+ void addService(const eServiceReference &ref, bool beforeCurrent=false);
+ void removeCurrent();
void FillFinished();
void setIgnoreService( const eServiceReference &service );
void getCurrent(eServiceReference &ref);
int getNextBeginningWithChar(char c);
-
+ int getPrevMarkerPos();
+ int getNextMarkerPos();
+
/* support for marked services */
void initMarked();
void addMarked(const eServiceReference &ref);
/* only in complex mode: */
enum {
celServiceNumber,
+ celMarkerPixmap,
celFolderPixmap,
celServiceName,
celServiceTypePixmap,
picDVB_T,
picDVB_C,
picFolder,
+ picMarker,
picElements
};
return -1;
}
-RESULT eDVBServiceList::addService(eServiceReference &ref)
+RESULT eDVBServiceList::addService(eServiceReference &ref, eServiceReference before)
{
if (!m_bouquet)
return -1;
- return m_bouquet->addService(ref);
+ return m_bouquet->addService(ref, before);
}
RESULT eDVBServiceList::removeService(eServiceReference &ref)
RESULT startEdit(ePtr<iMutableServiceList> &);
RESULT flushChanges();
- RESULT addService(eServiceReference &ref);
+ RESULT addService(eServiceReference &ref, eServiceReference before);
RESULT removeService(eServiceReference &ref);
RESULT moveService(eServiceReference &ref, int pos);
RESULT setListName(const std::string &name);