diff options
Diffstat (limited to 'muggle-plugin/sh_console_osd.c')
-rw-r--r-- | muggle-plugin/sh_console_osd.c | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/muggle-plugin/sh_console_osd.c b/muggle-plugin/sh_console_osd.c new file mode 100644 index 0000000..ebb4702 --- /dev/null +++ b/muggle-plugin/sh_console_osd.c @@ -0,0 +1,212 @@ +/* + * osd.c: Abstract On Screen Display layer + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: sh_console_osd.c,v 1.1 2004/02/01 18:22:53 LarsAC Exp $ + */ + +#include "myosd.h" +#include <string.h> +//#include "device.h" +// #include "i18n.h" +//#include "status.h" + +// --- cOsdItem -------------------------------------------------------------- + +cOsdItem::cOsdItem(eOSState State) +{ + text = NULL; +} + +cOsdItem::cOsdItem(const char *Text, eOSState State) +{ + text = NULL; + SetText(Text,true); +} + +cOsdItem::~cOsdItem() +{ + free(text); +} + +void cOsdItem::SetText(const char *Text, bool Copy) +{ + free(text); + text = Copy ? strdup(Text) : (char *)Text; // text assumes ownership! +} + +const char* cOsdItem::Get() +{ + return text; +} +void cOsdItem::Display() +{ + printf("%s\n", text); +} + +// --- cOsdMenu -------------------------------------------------------------- + +cOsdMenu::cOsdMenu(const char *Title, int c0, int c1, int c2, int c3, int c4) +{ + cols[0] = c0; + cols[1] = c1; + cols[2] = c2; + cols[3] = c3; + cols[4] = c4; + m_first = 0; + m_current = m_marked = -1; + subMenu = NULL; + helpRed = helpGreen = helpYellow = helpBlue = NULL; + status = NULL; +} + +cOsdMenu::~cOsdMenu() +{ + free(title); + delete subMenu; + free(status); +} + + +void cOsdMenu::SetTitle(const char *Title, bool ShowDate) +{ + title = strdup(Title); +} + +void cOsdMenu::Add(cOsdItem *Item) +{ + m_display.push_back(Item); +} + +void cOsdMenu::Display(void) +{ + //Interface->Clear(); + printf("\n\n\n\n"); + printf("----------(start %d, current %d)--------------------\n", + m_first, m_current); + //Interface->SetCols(cols); + //Interface->Title(title); + printf(" Title: %s\n", title); + //Interface->Help(helpRed, helpGreen, helpYellow, helpBlue); + for(int i= m_first; i < (int) m_display.size() && i < m_first+DISPLAY_SIZE; i++) + { + if(i == m_current) + { + printf("==>"); + + } + else + { + printf(" "); + + } + printf("%s\n", m_display[i]->Get()); + } + printf("----------------------------------------------\n"); + if(hasHotkeys) + { + printf("%15s (r) %15s (g) %15s (y) %15s (b)\n", + helpRed? helpRed :"" , + helpGreen? helpGreen :"" , + helpYellow? helpYellow :"" , + helpBlue? helpBlue :"" ); + + } +} + +int cOsdMenu::Index(cOsdItem *Item) +{ + int pos=0; + for(vector<cOsdItem*>::iterator iter = m_display.begin(); + iter != m_display.end(); iter++) + { + if((*iter) == Item) + { + break; + } + pos++; + } + return pos; +} +void cOsdMenu::SetCurrent(cOsdItem *Item) +{ + m_current = Item ? Index(Item) : -1; +} +void cOsdMenu::CursorUp(void) +{ + if(m_current >0) m_current--; + if(m_current < m_first) m_first = m_first - PAGE_JUMP; + Display(); +} +void cOsdMenu::CursorDown(void) +{ + if(m_current < (int)m_display.size()-1) + m_current++; + if(m_current >= m_first+DISPLAY_SIZE) m_first =m_first + PAGE_JUMP; + Display(); +} + +void cOsdMenu::PageUp(void) +{ + if(m_first >= PAGE_JUMP) + { + m_first -= PAGE_JUMP; + m_current -= PAGE_JUMP; + } + Display(); + +} +void cOsdMenu::PageDown(void) +{ + if(m_first+ PAGE_JUMP< (int)m_display.size()) + { + m_first += PAGE_JUMP; + m_current += PAGE_JUMP; + if(m_current < m_first) m_current = m_first; + if(m_current >= (int) m_display.size()) + m_current = (int) m_display.size(); + } + Display(); +} + +void cOsdMenu::Clear(void) +{ + m_first = 0; + m_current = m_marked = -1; + hasHotkeys = false; + for(vector<cOsdItem*>::iterator iter = m_display.begin(); + iter != m_display.end(); iter++) + { + delete *iter; + } + m_display.clear(); +} + +eOSState cOsdMenu::ProcessKey(eKeys Key) +{ + + switch (Key) { + case kUp|k_Repeat: + case kUp: CursorUp(); break; + case kDown|k_Repeat: + case kDown: CursorDown(); break; + case kLeft|k_Repeat: + case kLeft: PageUp(); break; + case kRight|k_Repeat: + case kRight: PageDown(); break; + case kBack: return osBack; + default: if (m_marked < 0) + return osUnknown; + } + return osContinue; +} + +void cOsdMenu::SetHelp(const char *Red, const char *Green, const char *Yellow, const char *Blue) +{ + helpRed = Red; + helpGreen = Green; + helpYellow = Yellow; + helpBlue = Blue; +} |