From cba5ef437391362f6588226e9f2192cc6fd8cee8 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sat, 13 Apr 2002 10:52:01 +0200 Subject: Implemented enhanced string editing --- CONTRIBUTORS | 2 + HISTORY | 2 + MANUAL | 14 +++---- i18n.c | 38 ++++++++++++++++++- menu.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++-------- 5 files changed, 152 insertions(+), 25 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index daa65966..d3050af1 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -202,6 +202,8 @@ Sergei Haller for adding the TPID to Hessen-3 in 'channels.conf' for suggesting that the EPG scan should skip channels with their 'Ca' parameter explicitly set to an other DVB card + for implementing enhanced string editing with upper-/lowercase, insert/overwrite + and delete Andreas Gebel for his help in keeping 'channels.conf' up to date diff --git a/HISTORY b/HISTORY index fda33e6e..c6da6166 100644 --- a/HISTORY +++ b/HISTORY @@ -1195,3 +1195,5 @@ Video Disk Recorder Revision History - Added some DVB-T channels for Berlin (Germany) to channels.conf.terr (thanks to Andreas Roedl). +- Implemented enhanced string editing with upper-/lowercase, insert/overwrite + and delete (thanks to Sergei Haller). diff --git a/MANUAL b/MANUAL index b9405051..d4f6ff98 100644 --- a/MANUAL +++ b/MANUAL @@ -17,9 +17,9 @@ Video Disk Recorder User's Manual Ok Ch display Select Switch Edit Accept Play Progress disp. Menu Menu on Menu off Menu off Menu off Menu off Menu off Menu on Back - Menu off VDR menu VDR menu Discard VDR menu Recordings menu - Red - Record Edit Edit - Play Jump - Green - Language New New - Rewind Skip -60s - Yellow - - Delete Delete - Delete Skip +60s + Red - Record Edit Edit ABC/abc Play Jump + Green - Language New New Ins/Ovr Rewind Skip -60s + Yellow - - Delete Delete Delete Delete Skip +60s Blue - Stop/Resume Mark On/Off(1) - Summary Stop 0..9 Ch select - - - Numeric inp. - Editing @@ -58,11 +58,9 @@ Video Disk Recorder User's Manual by pressing the "Right" button (which puts brackets around the current character as in "[R]TL"), selecting the desired character position with "Left" and "Right", and changing the character with the "Up" and "Down" - keys. "Ok" then confirms the changes. The special character '^' can be used - to "cut off" a string at this position. When this character is visible in the - brackets (as in abc[^]), the next press to the "Left" or "Ok" button will - actually cut off the string. Using "Up" and/or "Down" brings back the - original rest of the string (unless you have pressed "Left" or "Ok"). + keys. "Ok" then confirms the changes. The "Red" key toggles between + upper- and lowercase characters, while the "Green" key switches between + insert and overwrite mode. The "Yellow" key deletes the current character. The "Red", "Green", "Yellow" and "Blue" buttons have special meanings in various menus and are listed at the bottom of the on-screen-display. diff --git a/i18n.c b/i18n.c index 0b22f1dd..70cb682a 100644 --- a/i18n.c +++ b/i18n.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: i18n.c 1.79 2002/04/06 09:49:19 kls Exp $ + * $Id: i18n.c 1.80 2002/04/13 10:42:48 kls Exp $ * * Slovenian translations provided by Miha Setina and Matjaz Thaler * Italian translations provided by Alberto Carraro @@ -467,6 +467,42 @@ const tPhrase Phrases[] = { "Wyrzucenie", "Eyectar", }, + { "ABC/abc", + "ABC/abc", + "ABC/abc", + "ABC/abc", + "ABC/abc", + "ABC/abc", + "ABC/abc", + "ABC/abc", + "ABC/abc", + "ABC/abc", + "ABC/abc", + }, + { "Insert", + "Einfügen", + "",// TODO + "",// TODO + "",// TODO + "",// TODO + "",// TODO + "",// TODO + "",// TODO + "",// TODO + "",// TODO + }, + { "Overwrite", + "Überschreiben", + "",// TODO + "",// TODO + "",// TODO + "",// TODO + "",// TODO + "",// TODO + "",// TODO + "",// TODO + "",// TODO + }, // Confirmations: { "Delete channel?", "Kanal löschen?", diff --git a/menu.c b/menu.c index bc3aeb6e..bccebf36 100644 --- a/menu.c +++ b/menu.c @@ -4,10 +4,11 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.182 2002/04/06 09:41:59 kls Exp $ + * $Id: menu.c 1.183 2002/04/13 10:38:03 kls Exp $ */ #include "menu.h" +#include #include #include #include @@ -23,7 +24,7 @@ #define CHNUMWIDTH (Channels.Count() > 999 ? 5 : 4) // there are people with more than 999 channels... -const char *FileNameChars = " aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789-.#~^"; +const char *FileNameChars = " abcdefghijklmnopqrstuvwxyz0123456789-.#~"; // --- cMenuEditItem --------------------------------------------------------- @@ -515,6 +516,8 @@ private: int length; const char *allowed; int pos; + bool insert, newchar, uppercase; + void SetHelpKeys(void); virtual void Set(void); char Inc(char c, bool Up); public: @@ -530,6 +533,8 @@ cMenuEditStrItem::cMenuEditStrItem(const char *Name, char *Value, int Length, co length = Length; allowed = strdup(Allowed); pos = -1; + insert = uppercase = false; + newchar = true; Set(); } @@ -538,17 +543,50 @@ cMenuEditStrItem::~cMenuEditStrItem() delete allowed; } +void cMenuEditStrItem::SetHelpKeys(void) +{ + if (pos >= 0) + Interface->Help(tr("ABC/abc"), tr(insert ? "Overwrite" : "Insert"), tr("Delete")); + else + Interface->Help(NULL); +} + void cMenuEditStrItem::Set(void) { char buf[1000]; + int max = 30; // this indicates, how many characters fit on the screen + // and has to be calculated on the fly (TODO) + const char *fmt = insert && newchar ? "[]%c%s" : "[%c]%s"; + if (pos >= 0) { strncpy(buf, value, pos); - const char *s = value[pos] != '^' ? value + pos + 1 : ""; - snprintf(buf + pos, sizeof(buf) - pos - 2, "[%c]%s", *(value + pos), s); - SetValue(buf); + snprintf(buf + pos, sizeof(buf) - pos - 2, fmt, *(value + pos), value + pos + 1); + if (int(strlen(buf)) <= max) + SetValue(buf); + else if (pos + 4 <= max) { + buf[max - 1] = '>'; + buf[max] = 0; + SetValue(buf); + } + else if (buf[pos + 3]) { + buf[pos + 4 - max] = '<'; + buf[pos + 3] = '>'; + buf[pos + 4] = 0; + SetValue(buf + pos + 4 - max); + } + else { + buf[pos + 3 - max] = '<'; + SetValue(buf + pos + 3 - max); + } } - else + else if (int(strlen(value)) <= max) SetValue(value); + else { + strncpy(buf, value, max - 1); + buf[max - 1] = '>'; + buf[max] = 0; + SetValue(buf); + } } char cMenuEditStrItem::Inc(char c, bool Up) @@ -568,34 +606,85 @@ char cMenuEditStrItem::Inc(char c, bool Up) eOSState cMenuEditStrItem::ProcessKey(eKeys Key) { 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(); + 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) { + 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; + } + break; case kLeft|k_Repeat: case kLeft: if (pos > 0) { - if (value[pos] == '^') - value[pos] = 0; - pos--; + if (!insert || newchar) + pos--; + newchar = true; } + if (!insert && isalpha(value[pos])) + uppercase = isupper(value[pos]); break; case kRight|k_Repeat: - case kRight: if (pos < length && value[pos] != '^' && (pos < int(strlen(value) - 1) || value[pos] != ' ')) { + case kRight: if (pos < length && pos < int(strlen(value)) ) { if (++pos >= int(strlen(value))) { - value[pos] = ' '; - value[pos + 1] = 0; + if (pos == 0 || value[pos - 1] != ' ') { + value[pos] = ' '; + value[pos + 1] = 0; + } + else + pos--; // allow only blank at the end } } + newchar = true; + if (!insert && isalpha(value[pos])) + uppercase = isupper(value[pos]); + SetHelpKeys(); break; case kUp|k_Repeat: case kUp: case kDown|k_Repeat: - case kDown: if (pos >= 0) - value[pos] = Inc(value[pos], NORMALKEY(Key) == kUp); + case kDown: if (pos >= 0) { + if (insert && newchar) { + // create a new character in insert mode + if (int(strlen(value)) < length) { + 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); break; case kOk: if (pos >= 0) { - if (value[pos] == '^') - value[pos] = 0; pos = -1; + newchar = true; stripspace(value); + SetHelpKeys(); break; } // run into default -- cgit v1.2.3