From c9622ed49e250b776934dbd29a61bbb7a3ea2772 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Sat, 15 Oct 2005 15:40:50 +0000 Subject: [PATCH] add movemode in channellist (later it should only useable in bouquets) --- lib/python/Components/ServiceList.py | 3 +++ lib/python/Screens/ChannelSelection.py | 20 ++++++++++++--- lib/service/listboxservice.cpp | 46 ++++++++++++++++++++++++++++++---- lib/service/listboxservice.h | 8 +++++- 4 files changed, 67 insertions(+), 10 deletions(-) diff --git a/lib/python/Components/ServiceList.py b/lib/python/Components/ServiceList.py index 93c7929..0f71c44 100644 --- a/lib/python/Components/ServiceList.py +++ b/lib/python/Components/ServiceList.py @@ -61,6 +61,9 @@ class ServiceList(HTMLComponent, GUIComponent): return marked + def setCurrentMarked(self, state): + self.l.setCurrentMarked(state) + def setMode(self, mode): if mode == self.MODE_NORMAL: self.instance.setItemHeight(20) diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 5e35a7e..8b9f9b8 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -49,6 +49,7 @@ class ChannelSelection(Screen): def __init__(self, session): Screen.__init__(self, session) + self.entry_marked = False self.movemode = False self.bouquet_mark_edit = False @@ -121,9 +122,17 @@ class ChannelSelection(Screen): # ... def channelSelected(self): - self.session.nav.playService(self["list"].getCurrent()) - print "current: " + self["list"].getCurrent().toString() - self.close() + if not (self.movemode): + self.session.nav.playService(self["list"].getCurrent()) + print "current: " + self["list"].getCurrent().toString() + self.close() + else: + if self.entry_marked: + self["list"].setCurrentMarked(False) + self.entry_marked = False + else: + self["list"].setCurrentMarked(True) + self.entry_marked = True #called from infoBar def zap(self): @@ -139,7 +148,10 @@ class ChannelSelection(Screen): self.session.open(ChannelContextMenu, self) def setMoveMode(self, mode): - self.movemode = mode + if mode: + self.movemode = False + else: + self.movemode = True def showFavourites(self): l = self["list" ] diff --git a/lib/service/listboxservice.cpp b/lib/service/listboxservice.cpp index d4cbff2..f35c00a 100644 --- a/lib/service/listboxservice.cpp +++ b/lib/service/listboxservice.cpp @@ -124,30 +124,49 @@ void eListboxServiceContent::sort() DEFINE_REF(eListboxServiceContent); eListboxServiceContent::eListboxServiceContent() + :m_visual_mode(visModeSimple), m_size(0), m_current_marked(false), m_swap(m_list.end()) { - m_visual_mode = visModeSimple; - m_size = 0; cursorHome(); eServiceCenter::getInstance(m_service_center); } void eListboxServiceContent::cursorHome() { + list::iterator old = m_cursor; + m_cursor = m_list.begin(); m_cursor_number = 0; + + if ( m_current_marked && m_saved_cursor == m_list.end() ) + std::iter_swap( old, m_cursor ); } void eListboxServiceContent::cursorEnd() { + if ( m_current_marked && m_saved_cursor == m_list.end() && m_cursor != m_list.end() ) + m_swap = m_cursor; m_cursor = m_list.end(); m_cursor_number = m_size; } +int eListboxServiceContent::setCurrentMarked(bool state) +{ + bool prev = m_current_marked; + m_current_marked = state; + + if (state != prev && m_listbox) + m_listbox->entryChanged(m_cursor_number); + + return 0; +} + int eListboxServiceContent::cursorMove(int count) { + list::iterator old = m_cursor; + if (count > 0) { - while (count && (m_cursor != m_list.end())) + while(count && (m_cursor != m_list.end())) { ++m_cursor; ++m_cursor_number; @@ -162,7 +181,20 @@ int eListboxServiceContent::cursorMove(int count) ++count; } } - + + if ( m_current_marked && m_saved_cursor == m_list.end() ) + { + if ( m_cursor == m_list.end() ) + m_swap = old; + else if ( old == m_list.end() ) + { + std::iter_swap( m_swap, m_cursor ); + m_swap = m_list.end(); + } + else + std::iter_swap( old, m_cursor ); + } + return 0; } @@ -194,6 +226,7 @@ void eListboxServiceContent::cursorRestore() { m_cursor = m_saved_cursor; m_cursor_number = m_saved_cursor_number; + m_saved_cursor = m_list.end(); } int eListboxServiceContent::size() @@ -210,7 +243,10 @@ void eListboxServiceContent::setSize(const eSize &size) void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected) { painter.clip(eRect(offset, m_itemsize)); - if (cursorValid() && isMarked(*m_cursor)) + + if (m_current_marked && selected) + style.setStyle(painter, eWindowStyle::styleListboxMarked); + else if (cursorValid() && isMarked(*m_cursor)) style.setStyle(painter, eWindowStyle::styleListboxMarked); else style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); diff --git a/lib/service/listboxservice.h b/lib/service/listboxservice.h index 4e5a8dd..b2fc311 100644 --- a/lib/service/listboxservice.h +++ b/lib/service/listboxservice.h @@ -47,6 +47,8 @@ public: void sort(); + int setCurrentMarked(bool); + protected: void cursorHome(); void cursorEnd(); @@ -82,11 +84,15 @@ private: ePtr m_service_center; eServiceReference m_root; - + /* support for marked services */ std::set m_marked; std::set::const_iterator m_marked_iterator; + + /* support for movemode */ + bool m_current_marked; + list::iterator m_swap; }; #endif -- 2.7.4