diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2002-04-19 15:46:14 +0200 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2002-04-19 15:46:14 +0200 |
commit | 69d32fae060c11d8fcc65561e3a67ed50b9bca9b (patch) | |
tree | 0cfe27601c44a1564047f14179c2b06ec249199b /menu.c | |
parent | 982dcf09b423d42c24185f1774ea05b9f5e86d3d (diff) | |
download | vdr-69d32fae060c11d8fcc65561e3a67ed50b9bca9b.tar.gz vdr-69d32fae060c11d8fcc65561e3a67ed50b9bca9b.tar.bz2 |
Improved enhanced string editing
Diffstat (limited to 'menu.c')
-rw-r--r-- | menu.c | 51 |
1 files changed, 28 insertions, 23 deletions
@@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.184 2002/04/16 16:11:40 kls Exp $ + * $Id: menu.c 1.185 2002/04/19 15:46:14 kls Exp $ */ #include "menu.h" @@ -554,39 +554,44 @@ void cMenuEditStrItem::SetHelpKeys(void) 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); 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; + int width = Interface->Width() - Interface->GetCols()[0]; + if (cDvbApi::PrimaryDvbApi->WidthInCells(buf) <= width) { + // the whole buffer fits on the screen SetValue(buf); + return; } - else if (buf[pos + 3]) { - buf[pos + 4 - max] = '<'; - buf[pos + 3] = '>'; - buf[pos + 4] = 0; - SetValue(buf + pos + 4 - max); + width *= cDvbApi::PrimaryDvbApi->CellWidth(); + width -= cDvbApi::PrimaryDvbApi->Width('>'); // assuming '<' and '>' have the same with + int w = 0; + int i = 0; + int l = strlen(buf); + while (i < l && w <= width) + w += cDvbApi::PrimaryDvbApi->Width(buf[i++]); + if (i >= pos + 4) { + // the cursor fits on the screen + buf[i - 1] = '>'; + buf[i] = 0; + SetValue(buf); + return; } - else { - buf[pos + 3 - max] = '<'; - SetValue(buf + pos + 3 - max); + // the cursor doesn't fit on the screen + w = 0; + if (buf[i = pos + 3]) { + buf[i] = '>'; + buf[i + 1] = 0; } + while (i >= 0 && w <= width) + w += cDvbApi::PrimaryDvbApi->Width(buf[i--]); + buf[++i] = '<'; + SetValue(buf + i); } - else if (int(strlen(value)) <= max) + else SetValue(value); - else { - strncpy(buf, value, max - 1); - buf[max - 1] = '>'; - buf[max] = 0; - SetValue(buf); - } } char cMenuEditStrItem::Inc(char c, bool Up) |