diff options
Diffstat (limited to 'lib/service')
| -rw-r--r-- | lib/service/listboxservice.cpp | 46 | ||||
| -rw-r--r-- | lib/service/listboxservice.h | 8 |
2 files changed, 48 insertions, 6 deletions
diff --git a/lib/service/listboxservice.cpp b/lib/service/listboxservice.cpp index d4cbff20..f35c00a5 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 4e5a8dd5..b2fc311b 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<iServiceHandler> m_service_center; eServiceReference m_root; - + /* support for marked services */ std::set<eServiceReference> m_marked; std::set<eServiceReference>::const_iterator m_marked_iterator; + + /* support for movemode */ + bool m_current_marked; + list::iterator m_swap; }; #endif |
