Now shows the help text of a menu item while it's selected (up to two lines of
text, automatically wrapped correctly). Added print_centered() function. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8119 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
447564cfea
commit
a7aea4b86d
@ -33,7 +33,7 @@ static int32 sMenuOffset = 0;
|
|||||||
static int32
|
static int32
|
||||||
menu_height()
|
menu_height()
|
||||||
{
|
{
|
||||||
return console_height() - kFirstLine - kHelpLines;
|
return console_height() - kFirstLine - 1 - kHelpLines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -46,7 +46,18 @@ print_spacing(int32 count)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_item_at(int32 line, MenuItem *item)
|
print_centered(int32 line, const char *text)
|
||||||
|
{
|
||||||
|
console_set_cursor(console_width() / 2 - strlen(text) / 2, line);
|
||||||
|
printf("%s", text);
|
||||||
|
|
||||||
|
console_set_cursor(0, 0);
|
||||||
|
// this avoids unwanted line feeds
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_item_at(int32 line, MenuItem *item, bool clearHelp = true)
|
||||||
{
|
{
|
||||||
bool selected = item->IsSelected();
|
bool selected = item->IsSelected();
|
||||||
|
|
||||||
@ -105,6 +116,70 @@ print_item_at(int32 line, MenuItem *item)
|
|||||||
}
|
}
|
||||||
|
|
||||||
print_spacing(console_width() - length - 2*kOffsetX);
|
print_spacing(console_width() - length - 2*kOffsetX);
|
||||||
|
|
||||||
|
if (!selected)
|
||||||
|
return;
|
||||||
|
|
||||||
|
console_set_cursor(0, console_height() - kHelpLines);
|
||||||
|
console_set_color(WHITE, BLACK);
|
||||||
|
|
||||||
|
if (clearHelp) {
|
||||||
|
// clear help text area
|
||||||
|
for (int32 i = 0; i < console_width() * 2 - 1; i++)
|
||||||
|
putchar(' ');
|
||||||
|
|
||||||
|
console_set_cursor(0, console_height() - kHelpLines);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item->HelpText() != NULL) {
|
||||||
|
// show help text at the bottom of the screen,
|
||||||
|
// center it, and wrap it correctly
|
||||||
|
|
||||||
|
const char *text = item->HelpText();
|
||||||
|
int32 width = console_width() - 2 * kOffsetX;
|
||||||
|
int32 length = strlen(text);
|
||||||
|
|
||||||
|
if (length > width * 2)
|
||||||
|
width += 2 * kOffsetX - 1;
|
||||||
|
|
||||||
|
char buffer[width + 1];
|
||||||
|
buffer[width] = '\0';
|
||||||
|
// make sure the buffer is always terminated
|
||||||
|
|
||||||
|
int32 row = 0;
|
||||||
|
|
||||||
|
for (int32 i = 0; i < length && row < 2; i++) {
|
||||||
|
while (text[i] == ' ')
|
||||||
|
i++;
|
||||||
|
|
||||||
|
// copy as much bytes as possible
|
||||||
|
int32 bytes = width;
|
||||||
|
if (bytes > length - i)
|
||||||
|
bytes = length - i;
|
||||||
|
|
||||||
|
memcpy(buffer, text + i, bytes);
|
||||||
|
buffer[bytes] = '\0';
|
||||||
|
|
||||||
|
char *pos = strchr(buffer, '\n');
|
||||||
|
if (pos != NULL)
|
||||||
|
i = pos - buffer;
|
||||||
|
else if (bytes < length - i) {
|
||||||
|
// search for possible line breaks
|
||||||
|
pos = strrchr(buffer, ' ');
|
||||||
|
if (pos != NULL)
|
||||||
|
i = pos - buffer;
|
||||||
|
else {
|
||||||
|
// no wrapping possible
|
||||||
|
i += bytes;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
i += bytes;
|
||||||
|
|
||||||
|
buffer[i] = '\0';
|
||||||
|
print_centered(console_height() - kHelpLines + row, buffer);
|
||||||
|
row++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -113,17 +188,14 @@ draw_menu(Menu *menu)
|
|||||||
{
|
{
|
||||||
console_clear_screen();
|
console_clear_screen();
|
||||||
|
|
||||||
console_set_cursor(console_width()/2 - 7, 1);
|
|
||||||
console_set_color(WHITE, BLACK);
|
console_set_color(WHITE, BLACK);
|
||||||
printf("Welcome To The");
|
print_centered(1, "Welcome To The");
|
||||||
|
|
||||||
console_set_cursor(console_width()/2 - 8, 2);
|
|
||||||
console_set_color(WHITE, BLACK);
|
console_set_color(WHITE, BLACK);
|
||||||
printf("Haiku Boot Loader");
|
print_centered(2, "Haiku Boot Loader");
|
||||||
|
|
||||||
console_set_cursor(console_width()/2 - 12, 4);
|
|
||||||
console_set_color(GREEN, BLACK);
|
console_set_color(GREEN, BLACK);
|
||||||
printf("Copyright 2004 Haiku Inc.");
|
print_centered(4, "Copyright 2004 Haiku Inc.");
|
||||||
|
|
||||||
if (menu->Title()) {
|
if (menu->Title()) {
|
||||||
console_set_cursor(kOffsetX, kFirstLine - 2);
|
console_set_cursor(kOffsetX, kFirstLine - 2);
|
||||||
@ -137,8 +209,6 @@ draw_menu(Menu *menu)
|
|||||||
MenuItem *item;
|
MenuItem *item;
|
||||||
int32 i = 0;
|
int32 i = 0;
|
||||||
|
|
||||||
console_set_cursor(kOffsetX, kFirstLine);
|
|
||||||
|
|
||||||
while ((item = iterator.Next()) != NULL) {
|
while ((item = iterator.Next()) != NULL) {
|
||||||
if (item->Type() == MENU_ITEM_SEPARATOR) {
|
if (item->Type() == MENU_ITEM_SEPARATOR) {
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
@ -146,7 +216,7 @@ draw_menu(Menu *menu)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
print_item_at(i++, item);
|
print_item_at(i++, item, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 height = menu_height();
|
int32 height = menu_height();
|
||||||
|
Loading…
Reference in New Issue
Block a user