1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Improved enhanced string editing

This commit is contained in:
Klaus Schmidinger 2002-04-19 15:46:14 +02:00
parent 982dcf09b4
commit 69d32fae06
2 changed files with 30 additions and 24 deletions

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: interface.h 1.24 2001/09/01 15:14:50 kls Exp $ * $Id: interface.h 1.25 2002/04/19 13:17:15 kls Exp $
*/ */
#ifndef __INTERFACE_H #ifndef __INTERFACE_H
@ -46,6 +46,7 @@ public:
void SetBitmap(int x, int y, const cBitmap &Bitmap); void SetBitmap(int x, int y, const cBitmap &Bitmap);
void Flush(void); void Flush(void);
void SetCols(int *c); void SetCols(int *c);
const int *GetCols(void) { return cols; }
eDvbFont SetFont(eDvbFont Font); eDvbFont SetFont(eDvbFont Font);
char *WrapText(const char *Text, int Width, int *Height); char *WrapText(const char *Text, int Width, int *Height);
void Write(int x, int y, const char *s, eDvbColor FgColor = clrWhite, eDvbColor BgColor = clrBackground); void Write(int x, int y, const char *s, eDvbColor FgColor = clrWhite, eDvbColor BgColor = clrBackground);

51
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "menu.h"
@ -554,39 +554,44 @@ void cMenuEditStrItem::SetHelpKeys(void)
void cMenuEditStrItem::Set(void) void cMenuEditStrItem::Set(void)
{ {
char buf[1000]; 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"; const char *fmt = insert && newchar ? "[]%c%s" : "[%c]%s";
if (pos >= 0) { if (pos >= 0) {
strncpy(buf, value, pos); strncpy(buf, value, pos);
snprintf(buf + pos, sizeof(buf) - pos - 2, fmt, *(value + pos), value + pos + 1); snprintf(buf + pos, sizeof(buf) - pos - 2, fmt, *(value + pos), value + pos + 1);
if (int(strlen(buf)) <= max) int width = Interface->Width() - Interface->GetCols()[0];
if (cDvbApi::PrimaryDvbApi->WidthInCells(buf) <= width) {
// the whole buffer fits on the screen
SetValue(buf); SetValue(buf);
else if (pos + 4 <= max) { return;
buf[max - 1] = '>'; }
buf[max] = 0; 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); SetValue(buf);
return;
} }
else if (buf[pos + 3]) { // the cursor doesn't fit on the screen
buf[pos + 4 - max] = '<'; w = 0;
buf[pos + 3] = '>'; if (buf[i = pos + 3]) {
buf[pos + 4] = 0; buf[i] = '>';
SetValue(buf + pos + 4 - max); buf[i + 1] = 0;
}
else {
buf[pos + 3 - max] = '<';
SetValue(buf + pos + 3 - max);
} }
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); SetValue(value);
else {
strncpy(buf, value, max - 1);
buf[max - 1] = '>';
buf[max] = 0;
SetValue(buf);
}
} }
char cMenuEditStrItem::Inc(char c, bool Up) char cMenuEditStrItem::Inc(char c, bool Up)