summaryrefslogtreecommitdiff
path: root/muggle-plugin/sh_console_osd_menuitems.c
diff options
context:
space:
mode:
Diffstat (limited to 'muggle-plugin/sh_console_osd_menuitems.c')
-rw-r--r--muggle-plugin/sh_console_osd_menuitems.c530
1 files changed, 530 insertions, 0 deletions
diff --git a/muggle-plugin/sh_console_osd_menuitems.c b/muggle-plugin/sh_console_osd_menuitems.c
new file mode 100644
index 0000000..48b5d3a
--- /dev/null
+++ b/muggle-plugin/sh_console_osd_menuitems.c
@@ -0,0 +1,530 @@
+/*
+ * menuitems.c: General purpose menu items
+ *
+ * See the main source file 'vdr.c' for copyright information and
+ * how to reach the author.
+ *
+ * $Id: sh_console_osd_menuitems.c,v 1.1 2004/02/01 18:22:53 LarsAC Exp $
+ */
+
+#include "mymenuitems.h"
+
+const char *FileNameChars = " abcdefghijklmnopqrstuvwxyz0123456789-.#~";
+
+// --- cMenuEditItem ---------------------------------------------------------
+
+cMenuEditItem::cMenuEditItem(const char *Name)
+{
+ name = strdup(Name);
+ value = NULL;
+}
+
+cMenuEditItem::~cMenuEditItem()
+{
+ free(name);
+ free(value);
+}
+
+void cMenuEditItem::SetValue(const char *Value)
+{
+ free(value);
+ value = strdup(Value);
+ char *buffer = NULL;
+ asprintf(&buffer, "%s:\t%s", name, value);
+ SetText(buffer, false);
+ Display();
+}
+
+// --- cMenuEditIntItem ------------------------------------------------------
+
+cMenuEditIntItem::cMenuEditIntItem(const char *Name, int *Value, int Min, int Max)
+:cMenuEditItem(Name)
+{
+ value = Value;
+ min = Min;
+ max = Max;
+ Set();
+}
+
+void cMenuEditIntItem::Set(void)
+{
+ char buf[16];
+ snprintf(buf, sizeof(buf), "%d", *value);
+ SetValue(buf);
+}
+
+eOSState cMenuEditIntItem::ProcessKey(eKeys Key)
+{
+ return osContinue;
+}
+
+// --- cMenuEditBoolItem -----------------------------------------------------
+
+cMenuEditBoolItem::cMenuEditBoolItem(const char *Name, int *Value, const char *FalseString, const char *TrueString)
+:cMenuEditIntItem(Name, Value, 0, 1)
+{
+ falseString = FalseString ? FalseString : "no";
+ trueString = TrueString ? TrueString : "yes";
+ Set();
+}
+
+void cMenuEditBoolItem::Set(void)
+{
+ char buf[16];
+ snprintf(buf, sizeof(buf), "%s", *value ? trueString : falseString);
+ SetValue(buf);
+}
+
+// --- cMenuEditNumItem ------------------------------------------------------
+
+cMenuEditNumItem::cMenuEditNumItem(const char *Name, char *Value, int Length, bool Blind)
+:cMenuEditItem(Name)
+{
+ value = Value;
+ length = Length;
+ blind = Blind;
+ Set();
+}
+
+void cMenuEditNumItem::Set(void)
+{
+ if (blind) {
+ char buf[length + 1];
+ int i;
+ for (i = 0; i < length && value[i]; i++)
+ buf[i] = '*';
+ buf[i] = 0;
+ SetValue(buf);
+ }
+ else
+ SetValue(value);
+}
+
+eOSState cMenuEditNumItem::ProcessKey(eKeys Key)
+{
+ return osContinue;
+}
+
+// --- cMenuEditChrItem ------------------------------------------------------
+
+cMenuEditChrItem::cMenuEditChrItem(const char *Name, char *Value, const char *Allowed)
+:cMenuEditItem(Name)
+{
+ value = Value;
+ allowed = strdup(Allowed);
+ current = strchr(allowed, *Value);
+ if (!current)
+ current = allowed;
+ Set();
+}
+
+cMenuEditChrItem::~cMenuEditChrItem()
+{
+ free(allowed);
+}
+
+void cMenuEditChrItem::Set(void)
+{
+ char buf[2];
+ snprintf(buf, sizeof(buf), "%c", *value);
+ SetValue(buf);
+}
+
+eOSState cMenuEditChrItem::ProcessKey(eKeys Key)
+{
+ return osContinue;
+}
+
+// --- cMenuEditStrItem ------------------------------------------------------
+
+cMenuEditStrItem::cMenuEditStrItem(const char *Name, char *Value, int Length, const char *Allowed)
+:cMenuEditItem(Name)
+{
+ value = Value;
+ length = Length;
+ allowed = strdup(Allowed);
+ pos = -1;
+ insert = uppercase = false;
+ newchar = true;
+ ieCurChr = 0;
+ lastKey = kNone;
+ Set();
+}
+
+cMenuEditStrItem::~cMenuEditStrItem()
+{
+ free(allowed);
+}
+
+void cMenuEditStrItem::SetHelpKeys(void)
+{
+}
+
+void cMenuEditStrItem::Set(void)
+{
+}
+
+eOSState cMenuEditStrItem::ProcessKey(eKeys Key)
+{
+#if 0
+ const char c1[] = "-.#~,/_@1";
+ const char c2[] = "abcäåá2";
+ const char c3[] = "defé3";
+ const char c4[] = "ghi4";
+ const char c5[] = "jkl5";
+ const char c6[] = "mnoöñó6";
+ const char c7[] = "pqrs7";
+ const char c8[] = "tuvüú8";
+ const char c9[] = "wxyz9";
+ const char c0[] = " 0";
+
+ switch (Key) {
+ case kRed: // Switch between upper- and lowercase characters
+ if (pos >= 0 && (!insert || !newchar)) {
+ uppercase = !uppercase;
+ value[pos] = uppercase ? toupper(value[pos]) : tolower(value[pos]);
+ }
+ break;
+ case kGreen: // Toggle insert/overwrite modes
+ if (pos >= 0) {
+ insert = !insert;
+ newchar = true;
+ }
+ SetHelpKeys();
+ lastKey = Key;
+ break;
+ case kYellow|k_Repeat:
+ case kYellow: // Remove the character at current position; in insert mode it is the character to the right of cursor
+ if (pos >= 0) {
+ if (strlen(value) > 1) {
+ if (!insert || pos < int(strlen(value)) - 1)
+ memmove(value + pos, value + pos + 1, strlen(value) - pos);
+ // reduce position, if we removed the last character
+ if (pos == int(strlen(value)))
+ pos--;
+ }
+ else if (strlen(value) == 1)
+ value[0] = ' '; // This is the last character in the string, replace it with a blank
+ if (isalpha(value[pos]))
+ uppercase = isupper(value[pos]);
+ newchar = true;
+ }
+ lastKey = Key;
+ break;
+ case kLeft|k_Repeat:
+ case kLeft: if (pos > 0) {
+ if (!insert || newchar)
+ pos--;
+ newchar = true;
+ }
+ if (!insert && isalpha(value[pos]))
+ uppercase = isupper(value[pos]);
+ lastKey = Key;
+ break;
+ case kRight|k_Repeat:
+ case kRight: if (pos < length - 2 && pos < int(strlen(value)) ) {
+ if (++pos >= int(strlen(value))) {
+ if (pos >= 2 && value[pos - 1] == ' ' && value[pos - 2] == ' ')
+ pos--; // allow only two blanks at the end
+ else {
+ value[pos] = ' ';
+ value[pos + 1] = 0;
+ }
+ }
+ }
+ newchar = true;
+ if (!insert && isalpha(value[pos]))
+ uppercase = isupper(value[pos]);
+ if (pos == 0)
+ SetHelpKeys();
+ lastKey = Key;
+ break;
+ case kUp|k_Repeat:
+ case kUp:
+ case kDown|k_Repeat:
+ case kDown: if (pos >= 0) {
+ if (insert && newchar) {
+ // create a new character in insert mode
+ if (int(strlen(value)) < length - 1) {
+ memmove(value + pos + 1, value + pos, strlen(value) - pos + 1);
+ value[pos] = ' ';
+ }
+ }
+ if (uppercase)
+ value[pos] = toupper(Inc(tolower(value[pos]), NORMALKEY(Key) == kUp));
+ else
+ value[pos] = Inc( value[pos], NORMALKEY(Key) == kUp);
+ newchar = false;
+ }
+ else
+ return cMenuEditItem::ProcessKey(Key);
+ lastKey = Key;
+ break;
+ case k0|k_Repeat ... k9|k_Repeat:
+ case k0 ... k9: if (Key != lastKey) {
+ ieCurChr = 0;
+ if (!newchar) {
+ // kRight
+ if (pos < length - 2 && pos < int(strlen(value)) ) {
+ if (++pos >= int(strlen(value))) {
+ if (pos >= 2 && value[pos - 1] == ' ' && value[pos - 2] == ' ')
+ pos--; // allow only two blanks at the end
+ else {
+ value[pos] = ' ';
+ value[pos + 1] = 0;
+ }
+ }
+ }
+ newchar = true;
+ if (!insert && isalpha(value[pos]))
+ uppercase = isupper(value[pos]);
+ }
+ }
+ // kUp/kDown
+ if (pos >= 0) {
+ if (insert && newchar) {
+ // create a new character in insert mode
+ if (int(strlen(value)) < length - 1) {
+ memmove(value + pos + 1, value + pos, strlen(value) - pos + 1);
+ value[pos] = ' ';
+ }
+ }
+ }
+ else
+ return cMenuEditItem::ProcessKey(Key);
+ switch (Key) {
+ case k1:
+ if (uppercase)
+ value[pos] = toupper(c1[ieCurChr]);
+ else
+ value[pos] = c1[ieCurChr];
+ if (c1[ieCurChr+1] == 0)
+ ieCurChr = 0;
+ else
+ ieCurChr++;
+ break;
+ case k2:
+ if (uppercase)
+ value[pos] = toupper(c2[ieCurChr]);
+ else
+ value[pos] = c2[ieCurChr];
+ if (c2[ieCurChr+1] == 0)
+ ieCurChr = 0;
+ else
+ ieCurChr++;
+ break;
+ case k3:
+ if (uppercase)
+ value[pos] = toupper(c3[ieCurChr]);
+ else
+ value[pos] = c3[ieCurChr];
+ if (c3[ieCurChr+1] == 0)
+ ieCurChr = 0;
+ else
+ ieCurChr++;
+ break;
+ case k4:
+ if (uppercase)
+ value[pos] = toupper(c4[ieCurChr]);
+ else
+ value[pos] = c4[ieCurChr];
+ if (c4[ieCurChr+1] == 0)
+ ieCurChr = 0;
+ else
+ ieCurChr++;
+ break;
+ case k5:
+ if (uppercase)
+ value[pos] = toupper(c5[ieCurChr]);
+ else
+ value[pos] = c5[ieCurChr];
+ if (c5[ieCurChr+1] == 0)
+ ieCurChr = 0;
+ else
+ ieCurChr++;
+ break;
+ case k6:
+ if (uppercase)
+ value[pos] = toupper(c6[ieCurChr]);
+ else
+ value[pos] = c6[ieCurChr];
+ if (c6[ieCurChr+1] == 0)
+ ieCurChr = 0;
+ else
+ ieCurChr++;
+ break;
+ case k7:
+ if (uppercase)
+ value[pos] = toupper(c7[ieCurChr]);
+ else
+ value[pos] = c7[ieCurChr];
+ if (c7[ieCurChr+1] == 0)
+ ieCurChr = 0;
+ else
+ ieCurChr++;
+ break;
+ case k8:
+ if (uppercase)
+ value[pos] = toupper(c8[ieCurChr]);
+ else
+ value[pos] = c8[ieCurChr];
+ if (c8[ieCurChr+1] == 0)
+ ieCurChr = 0;
+ else
+ ieCurChr++;
+ break;
+ case k9:
+ if (uppercase)
+ value[pos] = toupper(c9[ieCurChr]);
+ else
+ value[pos] = c9[ieCurChr];
+ if (c9[ieCurChr+1] == 0)
+ ieCurChr = 0;
+ else
+ ieCurChr++;
+ break;
+ case k0:
+ if (uppercase)
+ value[pos] = toupper(c0[ieCurChr]);
+ else
+ value[pos] = c0[ieCurChr];
+ if (c0[ieCurChr+1] == 0)
+ ieCurChr = 0;
+ else
+ ieCurChr++;
+ break;
+ default:
+ break;
+ }
+ lastKey = Key;
+ newchar = false;
+ break;
+ case kOk: if (pos >= 0) {
+ pos = -1;
+ lastKey = Key;
+ newchar = true;
+ stripspace(value);
+ SetHelpKeys();
+ break;
+ }
+ // run into default
+ default: if (pos >= 0 && BASICKEY(Key) == kKbd) {
+ int c = KEYKBD(Key);
+ if (c <= 0xFF) {
+ const char *p = strchr(allowed, tolower(c));
+ if (p) {
+ int l = strlen(value);
+ if (insert && l < length - 1)
+ memmove(value + pos + 1, value + pos, l - pos + 1);
+ value[pos] = c;
+ if (pos < length - 2)
+ pos++;
+ if (pos >= l) {
+ value[pos] = ' ';
+ value[pos + 1] = 0;
+ }
+ }
+ else {
+ switch (c) {
+ case 0x7F: // backspace
+ if (pos > 0) {
+ pos--;
+ return ProcessKey(kYellow);
+ }
+ break;
+ }
+ }
+ }
+ else {
+ switch (c) {
+ case kfHome: pos = 0; break;
+ case kfEnd: pos = strlen(value) - 1; break;
+ case kfIns: return ProcessKey(kGreen);
+ case kfDel: return ProcessKey(kYellow);
+ }
+ }
+ }
+ else
+ return cMenuEditItem::ProcessKey(Key);
+ }
+ Set();
+#endif
+ return osContinue;
+}
+
+// --- cMenuEditStraItem -----------------------------------------------------
+
+cMenuEditStraItem::cMenuEditStraItem(const char *Name, int *Value, int NumStrings, const char * const *Strings)
+:cMenuEditIntItem(Name, Value, 0, NumStrings - 1)
+{
+ strings = Strings;
+ Set();
+}
+
+void cMenuEditStraItem::Set(void)
+{
+ SetValue(strings[*value]);
+}
+
+// --- cMenuTextItem ---------------------------------------------------------
+
+cMenuTextItem::cMenuTextItem(const char *Text, int X, int Y, int W, int H, eDvbColor FgColor, eDvbColor BgColor, eDvbFont Font)
+{
+
+ text = strdup(Text);
+}
+
+cMenuTextItem::~cMenuTextItem()
+{
+ free(text);
+}
+
+void cMenuTextItem::Clear(void)
+{
+}
+
+void cMenuTextItem::Display(int Offset, eDvbColor FgColor, eDvbColor BgColor)
+{
+}
+
+void cMenuTextItem::ScrollUp(bool Page)
+{
+}
+
+void cMenuTextItem::ScrollDown(bool Page)
+{
+}
+
+eOSState cMenuTextItem::ProcessKey(eKeys Key)
+{
+ return osContinue;
+}
+
+// --- cMenuSetupPage --------------------------------------------------------
+
+cMenuSetupPage::cMenuSetupPage(void)
+:cOsdMenu("", 33)
+{
+ plugin = NULL;
+}
+
+void cMenuSetupPage::SetSection(const char *Section)
+{
+}
+
+eOSState cMenuSetupPage::ProcessKey(eKeys Key)
+{
+ return osContinue;
+}
+
+void cMenuSetupPage::SetPlugin(cPlugin *Plugin)
+{
+}
+
+void cMenuSetupPage::SetupStore(const char *Name, const char *Value)
+{
+}
+
+void cMenuSetupPage::SetupStore(const char *Name, int Value)
+{
+}