summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2002-04-13 10:52:01 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2002-04-13 10:52:01 +0200
commitcba5ef437391362f6588226e9f2192cc6fd8cee8 (patch)
tree2f154199308e0212ab185893e5f91d7c06a3d0ce
parent37fa217a09a3b52aee06e91069933bd7b4e54967 (diff)
downloadvdr-cba5ef437391362f6588226e9f2192cc6fd8cee8.tar.gz
vdr-cba5ef437391362f6588226e9f2192cc6fd8cee8.tar.bz2
Implemented enhanced string editing
-rw-r--r--CONTRIBUTORS2
-rw-r--r--HISTORY2
-rw-r--r--MANUAL14
-rw-r--r--i18n.c38
-rw-r--r--menu.c121
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 <Sergei.Haller@math.uni-giessen.de>
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 <andreas@xcapenet.de>
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 <mihasetina@softhome.net> and Matjaz Thaler <matjaz.thaler@guest.arnes.si>
* Italian translations provided by Alberto Carraro <bertocar@tin.it>
@@ -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 <ctype.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
@@ -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