diff options
Diffstat (limited to 'lib/components/listboxepg.cpp')
| -rw-r--r-- | lib/components/listboxepg.cpp | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/lib/components/listboxepg.cpp b/lib/components/listboxepg.cpp new file mode 100644 index 00000000..a8edd287 --- /dev/null +++ b/lib/components/listboxepg.cpp @@ -0,0 +1,203 @@ +#include <lib/components/listboxepg.h> +#include <lib/dvb/epgcache.h> +#include <lib/service/service.h> + +void eListboxEPGContent::setRoot(const eServiceReference &root) +{ + eEPGCache *epg=NULL; + if ( !eEPGCache::getInstance(epg) ) + { + m_list.clear(); + m_root = root; + + epg->Lock(); + epg->startTimeQuery(root); + ePtr<eServiceEvent> ptr; + while( !epg->getNextTimeEntry(ptr) ) + m_list.push_back(ptr); + + m_size = m_list.size(); + cursorHome(); + + if (m_listbox) + m_listbox->entryReset(); + } +} + +void eListboxEPGContent::getCurrent(ePtr<eServiceEvent>& evt) +{ + if (cursorValid()) + evt = *m_cursor; + else + evt = 0; +} + +void eListboxEPGContent::setElementPosition(int element, eRect where) +{ + if ((element >= 0) && (element < celElements)) + m_element_position[element] = where; +} + +void eListboxEPGContent::setElementFont(int element, gFont *font) +{ + if ((element >= 0) && (element < celElements)) + m_element_font[element] = font; +} + +void eListboxEPGContent::sort() +{ +#if 0 + ePtr<iListableService> lst; + if (!m_service_center->list(m_root, lst)) + { + m_list.sort(iListableServiceCompare(lst)); + /* FIXME: is this really required or can we somehow keep the current entry? */ + cursorHome(); + if (m_listbox) + m_listbox->entryReset(); + } +#endif +} + +DEFINE_REF(eListboxEPGContent); + +eListboxEPGContent::eListboxEPGContent() + :m_size(0) +{ + cursorHome(); +} + +void eListboxEPGContent::cursorHome() +{ + m_cursor = m_list.begin(); + m_cursor_number = 0; +} + +void eListboxEPGContent::cursorEnd() +{ + m_cursor = m_list.end(); + m_cursor_number = m_size; +} + +int eListboxEPGContent::cursorMove(int count) +{ + list::iterator old = m_cursor; + + if (count > 0) + { + while(count && (m_cursor != m_list.end())) + { + ++m_cursor; + ++m_cursor_number; + --count; + } + } else if (count < 0) + { + while (count && (m_cursor != m_list.begin())) + { + --m_cursor; + --m_cursor_number; + ++count; + } + } + + return 0; +} + +int eListboxEPGContent::cursorValid() +{ + return m_cursor != m_list.end(); +} + +int eListboxEPGContent::cursorSet(int n) +{ + cursorHome(); + cursorMove(n); + + return 0; +} + +int eListboxEPGContent::cursorGet() +{ + return m_cursor_number; +} + +void eListboxEPGContent::cursorSave() +{ + m_saved_cursor = m_cursor; + m_saved_cursor_number = m_cursor_number; +} + +void eListboxEPGContent::cursorRestore() +{ + m_cursor = m_saved_cursor; + m_cursor_number = m_saved_cursor_number; + m_saved_cursor = m_list.end(); +} + +int eListboxEPGContent::size() +{ + return m_size; +} + +void eListboxEPGContent::setSize(const eSize &size) +{ + m_itemsize = size; + eSize s = m_itemsize; + s.setWidth((size.width()/4)-10); + m_element_position[celBeginTime] = eRect(ePoint(0, 0), s); + m_element_font[celBeginTime] = new gFont("Arial", 14); + s.setWidth(size.width()/4*3); + m_element_position[celTitle] = eRect(ePoint(size.width()/4, 0), s); + m_element_font[celTitle] = new gFont("Arial", 14); +} + +void eListboxEPGContent::paint(gPainter &painter, eWindowStyle &style, const ePoint &offset, int selected) +{ + painter.clip(eRect(offset, m_itemsize)); + style.setStyle(painter, selected ? eWindowStyle::styleListboxSelected : eWindowStyle::styleListboxNormal); + painter.clear(); + + if (cursorValid()) + { + for (int e = 0; e < celElements; ++e) + { + if (!m_element_font[e]) + continue; + + painter.setFont(m_element_font[e]); + + std::string text = "<n/a>"; + + switch (e) + { + case celBeginTime: + { + tm t; + localtime_r(&(*m_cursor)->m_begin, &t); + char tmp[13]; + snprintf(tmp, 13, "%02d.%02d, %02d:%02d", + t.tm_mday, t.tm_mon+1, + t.tm_hour, t.tm_min); + text=tmp; + break; + } + case celTitle: + { + text = (*m_cursor)->m_event_name; + break; + } + } + + eRect area = m_element_position[e]; + area.moveBy(offset.x(), offset.y()); + + painter.renderText(area, text); + } + + if (selected) + style.drawFrame(painter, eRect(offset, m_itemsize), eWindowStyle::frameListboxEntry); + } + painter.clippop(); +} + |
