analog-utilities/src/menu.h

391 lines
8.1 KiB
C

#ifndef __MENU_H
#define __MENU_H
#if defined(__APPLE2ENH__)
#define CHAR_CURSOR 0x7F
#define CHAR_SEPARATOR '_'
#define CHAR_BAR_MIDDLE 0xD3
#define CHAR_BORDER_BOTTOM 0xCC
#define CHAR_TITLEBAR_ENCLOSED 0xDC
#define CHAR_BORDER_TOP '_'
#define CHAR_BORDER_RIGHT 0xDA
#define CHAR_BORDER_LEFT 0xDF
#define CHAR_BORDER_TOP_LEFT 0xDA
#define CHAR_BORDER_TOP_RIGHT 0xDF
#define CHAR_TITLEBAR_FOLDER 0xD4
#define CHAR_SCROLLBAR_FULL 0xA0
#define CHAR_SCROLLBAR_EMPTY 0xD6
#define CHAR_SCROLLBAR_RIGHT 0xDF
#define CHAR_SCROLLBAR_LEFT 0xDA
#define CHAR_SCROLLBAR_TOP 0xDC
#define CHAR_SCROLLBAR_BOTTOM 0xDC
#define CHAR_BORDER_BOTTOM_LEFT ' '
#define CHAR_BORDER_BOTTOM_RIGHT ' '
#else
#define CHAR_CURSOR (' '|0x80)
#define CHAR_SEPARATOR '_'
#define CHAR_BAR_MIDDLE '-'
#define CHAR_BORDER_BOTTOM '-'
#define CHAR_TITLEBAR_ENCLOSED '-'
#define CHAR_BORDER_TOP '_'
#define CHAR_BORDER_RIGHT '!'
#define CHAR_BORDER_LEFT '!'
#define CHAR_BORDER_TOP_LEFT '.'
#define CHAR_BORDER_TOP_RIGHT '.'
#define CHAR_TITLEBAR_FOLDER '_'
#define CHAR_SCROLLBAR_FULL 0xA0
#define CHAR_SCROLLBAR_EMPTY ':'
#define CHAR_SCROLLBAR_RIGHT ' '
#define CHAR_SCROLLBAR_LEFT ' '
#define CHAR_SCROLLBAR_TOP ' '
#define CHAR_SCROLLBAR_BOTTOM ' '
#define CHAR_BORDER_BOTTOM_LEFT '\''
#define CHAR_BORDER_BOTTOM_RIGHT '\''
#endif
void repeatchar(char ch, int num) {
while(num--) {
cputc(ch);
}
}
void hline() {
repeatchar(CHAR_BAR_MIDDLE, 40);
}
void backdrop(char *str) {
int w, i;
w = strlen(str);
if(w > 20) {
w = 20;
}
clrscr();
gotoy(0); gotox(1);
cputs("V2 Analog");
gotoy(0); gotox(39 - w);
if((w >= 19) && str[19])
#if defined(__APPLE2ENH__)
w = 19;
#else
w = 17;
#endif
for(i = 0; i < w; i++) {
cputc(str[i]);
}
#if defined(__APPLE2ENH__)
if((i == 19) && str[i])
cputc(0xC9); // Elipsis
#else
if((i == 17) && str[i])
cputs("...");
#endif
gotoy(1); gotox(0);
hline();
gotoy(22); gotox(0);
hline();
gotoy(23); gotox(4);
cputs("https://www.v2retrocomputing.com");
}
void printlimited(char *str, int maxwidth) {
int i;
if(strlen(str) <= maxwidth) {
cputs(str);
} else {
for(i = 0; i < (maxwidth-3); i++) {
cputc(str[i]);
}
cputs("...");
}
}
void window(char *title, int width, int height, int type) {
int w, x, y, a, b, c;
if(width > 38) {
width = 40;
}
if(height > 22) {
height = 22;
}
y = 12 - ((height+2)/2);
if(strlen(title) > (width-2)) {
w = width-2;
} else {
w = strlen(title);
}
if(width < 40) {
x = 20 - (width/2);
} else {
x = 0;
}
#if defined(__APPLE2ENH__)
a = 0;
#else
a = (width < 38);
#endif
b = (width < 40);
x -= a+b;
#if defined(__APPLE2ENH__)
if(y > 2) {
gotoy(y-1); gotox(x);
if(a) cputc(' ');
if(b) cputc(' ');
repeatchar(CHAR_BORDER_TOP, type ? width : w);
if(!type && (w < width)) repeatchar(' ', width - w);
if(b) cputc(' ');
if(a) cputc(' ');
}
#else
if(y > 2) {
gotoy(y-1); gotox(x);
repeatchar(' ', width+a+a+b+b);
}
#endif
if(y+height < 22) {
gotoy(y+height); gotox(x);
repeatchar(' ', width+a+a+b+b);
}
gotoy(y); gotox(x);
if(a) cputc(' ');
if(b) cputc(CHAR_BORDER_TOP_LEFT);
if(type) {
c = (width - w) / 2;
repeatchar(CHAR_TITLEBAR_ENCLOSED, c);
}
revers(1);
printlimited(title, w);
revers(0);
#if defined(__APPLE2ENH__)
if(!type) cputc(CHAR_TITLEBAR_FOLDER);
#endif
if(type) {
repeatchar(CHAR_TITLEBAR_ENCLOSED, width - (w+c));
if(b) cputc(CHAR_BORDER_TOP_RIGHT);
} else {
#if defined(__APPLE2ENH__)
repeatchar(CHAR_BORDER_TOP, width-(w+1));
if(b) cputc(' ');
#else
repeatchar(CHAR_BORDER_TOP, width-w);
if(b) cputc(CHAR_BORDER_TOP_RIGHT);
#endif
}
if(a) cputc(' ');
y++;
#if defined(__APPLE2ENH__)
gotoy(y); gotox(x);
if(a) cputc(' ');
if(b) cputc(CHAR_BORDER_RIGHT);
repeatchar(CHAR_BORDER_BOTTOM, width);
if(b) cputc(CHAR_BORDER_LEFT);
if(a) cputc(' ');
for(c = 1; c < height-1; c++) {
#else
for(c = 0; c < height; c++) {
#endif
gotoy(y+c); gotox(x);
if(a) cputc(' ');
if(b) cputc(CHAR_BORDER_RIGHT);
repeatchar(' ', width);
if(b) cputc(CHAR_BORDER_LEFT);
if(a) cputc(' ');
}
#if defined(__APPLE2ENH__)
gotoy(y+c); gotox(x);
if(a) cputc(' ');
if(b) cputc(CHAR_BORDER_RIGHT);
repeatchar(CHAR_BORDER_TOP, width);
if(b) cputc(CHAR_BORDER_LEFT);
if(a) cputc(' ');
c++;
#endif
if((y+c) < 22) {
gotoy(y+c); gotox(x);
if(a) cputc(' ');
if(b) cputc(CHAR_BORDER_BOTTOM_LEFT);
repeatchar(CHAR_BORDER_BOTTOM, width);
if(b) cputc(CHAR_BORDER_BOTTOM_RIGHT);
if(a) cputc(' ');
}
}
void message(char *title, char *str) {
int w, x, c;
if(strlen(str) > 34) {
c = w = 34;
} else {
c = w = strlen(str);
}
if(strlen(title) > 34) {
c = 34;
} else if(strlen(title) > w) {
c = strlen(title);
}
window(title, c+4, 7, 1);
x = 20 - (w / 2);
gotoy(11); gotox(x);
printlimited(str, w);
// for(c = 0; (c < w) && str[c]; c++) {
// cputc(str[c]);
// }
x = 20 - 2;
gotoy(13); gotox(x);
revers(1);
cputs(" OK ");
revers(0);
for(;;) {
switch(cgetc()) {
case 0x0A:
case 0x0D:
case 0x1B:
case 'O':
case 'o':
return;
}
}
}
int confirm(char *title, char *str) {
int w, x, c, sel = 1;
if(strlen(str) > 34) {
c = w = 34;
} else {
c = w = strlen(str);
}
if(strlen(title) > 34) {
c = 34;
} else if(strlen(title) > w) {
c = strlen(title);
}
window(title, c+4, 7, 1);
x = 20 - (w / 2);
gotoy(11); gotox(x);
printlimited(str, w);
for(;;) {
x = 20 - 5;
gotoy(13); gotox(x);
if(sel) {
revers(1);
cputs(" Yes ");
revers(0);
cputs(" [No]");
} else {
cputs("[Yes] ");
revers(1);
cputs(" No ");
revers(0);
}
switch(cgetc()) {
case 0x08:
case 0x0A:
case 0x0B:
case 0x15:
sel = !sel;
break;
case 0x0D:
return sel;
case 'Y':
case 'y':
return 1;
case 0x1B:
case 'N':
case 'n':
return 0;
}
}
}
#ifdef __V2ANALOG_H
int prompt_slot(char *progname) {
int c;
int done=0;
// Attempt to find the lowest numbered V2 Analog Card
for(c = 7; c > 0; c--) {
if(!memcmp("V2A", (uint8_t *)(0xC0F8 + (c << 8)), 3)) {
cardslot = c;
}
}
backdrop(progname);
window(" Slot Number? ", 38, 7, 1);
gotoy(11); gotox(2);
cputs("Which slot is the card installed in?");
while(!done) {
#if defined(__APPLE2ENH__)
gotoy(12); gotox(19);
repeatchar(CHAR_BORDER_TOP, 3);
#endif
gotoy(13); gotox(19);
revers(1);
printf(" %i ", cardslot);
revers(0);
c = cgetc();
if((c >= '1') && (c <= '7')) {
cardslot = c - '0';
return 1;
} else
switch(c) {
case 0x08:
case 0x0A:
case 0x2D:
if(cardslot > 0)
cardslot--;
break;
case 0x0B:
case 0x15:
case 0x2B:
if(cardslot < 7)
cardslot++;
break;
case 0x0D:
done = 1;
return 1;
case 0x1B:
return 0;
}
}
}
#endif
#endif /* __MENU_H */