VOID MiniTuiDrawProgressBar(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, ULONG Position, ULONG Range, PCHAR ProgressText) { ULONG i; ULONG ProgressBarWidth = (Right - Left) - 4; // First make sure the progress bar text fits UiTruncateStringEllipsis(ProgressText, ProgressBarWidth - 4); if (Position > Range) { Position = Range; } // // Draw the "Loading..." text // TuiDrawCenteredText(Left + 2, Top + 1, Right - 2, Top + 1, ProgressText, ATTR(7, 0)); // Draw the percent complete for (i=0; i<(Position*ProgressBarWidth)/Range; i++) { TuiDrawText(Left+2+i, Top+2, "\xDB", ATTR(UiTextColor, UiMenuBgColor)); } TuiUpdateDateTime(); VideoCopyOffScreenBufferToVRAM(); }
BOOLEAN TuiDisplayMenu(PCSTR MenuHeader, PCSTR MenuFooter, BOOLEAN ShowBootOptions, PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultMenuItem, LONG MenuTimeOut, ULONG* SelectedMenuItem, BOOLEAN CanEscape, UiMenuKeyPressFilterCallback KeyPressFilter) { UI_MENU_INFO MenuInformation; ULONG LastClockSecond; ULONG CurrentClockSecond; ULONG KeyPress; // // Check if there's no timeout if (!MenuTimeOut) { // // Return the default selected item // if (SelectedMenuItem) *SelectedMenuItem = DefaultMenuItem; return TRUE; } // // Setup the MENU_INFO structure // MenuInformation.MenuHeader = MenuHeader; MenuInformation.MenuFooter = MenuFooter; MenuInformation.ShowBootOptions = ShowBootOptions; MenuInformation.MenuItemList = MenuItemList; MenuInformation.MenuItemCount = MenuItemCount; MenuInformation.MenuTimeRemaining = MenuTimeOut; MenuInformation.SelectedMenuItem = DefaultMenuItem; // // Calculate the size of the menu box // TuiCalcMenuBoxSize(&MenuInformation); // // Draw the menu // UiVtbl.DrawMenu(&MenuInformation); // // Get the current second of time // LastClockSecond = ArcGetTime()->Second; // // Process keys // while (TRUE) { // // Process key presses // KeyPress = TuiProcessMenuKeyboardEvent(&MenuInformation, KeyPressFilter); // // Check for ENTER or ESC // if (KeyPress == KEY_ENTER) break; if (CanEscape && KeyPress == KEY_ESC) return FALSE; // // Update the date & time // TuiUpdateDateTime(); VideoCopyOffScreenBufferToVRAM(); // // Check if there is a countdown // if (MenuInformation.MenuTimeRemaining > 0) { // // Get the updated time, seconds only // CurrentClockSecond = ArcGetTime()->Second; // // Check if more then a second has now elapsed // if (CurrentClockSecond != LastClockSecond) { // // Update the time information // LastClockSecond = CurrentClockSecond; MenuInformation.MenuTimeRemaining--; // // Update the menu // TuiDrawMenuBox(&MenuInformation); VideoCopyOffScreenBufferToVRAM(); } } else if (MenuInformation.MenuTimeRemaining == 0) { // // A time out occurred, exit this loop and return default OS // break; } MachHwIdle(); } // // Return the selected item // if (SelectedMenuItem) *SelectedMenuItem = MenuInformation.SelectedMenuItem; return TRUE; }
VOID TuiDrawBackdrop(VOID) { // // Fill in the background (excluding title box & status bar) // TuiFillArea(0, TUI_TITLE_BOX_CHAR_HEIGHT, UiScreenWidth - 1, UiScreenHeight - 2, UiBackdropFillStyle, ATTR(UiBackdropFgColor, UiBackdropBgColor)); // // Draw the title box // TuiDrawBox(0, 0, UiScreenWidth - 1, TUI_TITLE_BOX_CHAR_HEIGHT - 1, D_VERT, D_HORZ, TRUE, FALSE, ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); // // Draw version text // TuiDrawText(2, 1, GetFreeLoaderVersionString(), ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); // // Draw copyright // TuiDrawText(2, 2, BY_AUTHOR, ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); TuiDrawText(2, 3, AUTHOR_EMAIL, ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); // // Draw help text // TuiDrawText(UiScreenWidth - 16, 3, /*"F1 for Help"*/"F8 for Options", ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); // // Draw title text // TuiDrawText( (UiScreenWidth / 2) - (strlen(UiTitleBoxTitleText) / 2), 2, UiTitleBoxTitleText, ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); // // Draw status bar // TuiDrawStatusText("Welcome to FreeLoader!"); // // Update the date & time // TuiUpdateDateTime(); VideoCopyOffScreenBufferToVRAM(); }
BOOLEAN TuiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length) { int width = 8; unsigned int height = 1; int curline = 0; int k; size_t i , j; int x1, x2, y1, y2; char temp[260]; char key; int EditBoxLine; ULONG EditBoxStartX, EditBoxEndX; int EditBoxCursorX; unsigned int EditBoxTextCount; int EditBoxTextDisplayIndex; BOOLEAN ReturnCode; PVOID ScreenBuffer; // Save the screen contents ScreenBuffer = MmHeapAlloc(UiScreenWidth * UiScreenHeight * 2); TuiSaveScreen(ScreenBuffer); // Find the height for (i=0; i<strlen(MessageText); i++) { if (MessageText[i] == '\n') height++; } // Find the width for (i=0,j=0,k=0; i<height; i++) { while ((MessageText[j] != '\n') && (MessageText[j] != 0)) { j++; k++; } if (k > width) width = k; k = 0; j++; } // Calculate box area x1 = (UiScreenWidth - (width+2))/2; x2 = x1 + width + 3; y1 = ((UiScreenHeight - height - 2)/2) + 1; y2 = y1 + height + 4; // Draw the box TuiDrawBox(x1, y1, x2, y2, D_VERT, D_HORZ, TRUE, TRUE, ATTR(UiMessageBoxFgColor, UiMessageBoxBgColor)); // Draw the text for (i=0,j=0; i<strlen(MessageText)+1; i++) { if ((MessageText[i] == '\n') || (MessageText[i] == 0)) { temp[j] = 0; j = 0; UiDrawText(x1+2, y1+1+curline, temp, ATTR(UiMessageBoxFgColor, UiMessageBoxBgColor)); curline++; } else temp[j++] = MessageText[i]; } EditBoxTextCount = 0; EditBoxLine = y2 - 2; EditBoxStartX = x1 + 3; EditBoxEndX = x2 - 3; UiFillArea(EditBoxStartX, EditBoxLine, EditBoxEndX, EditBoxLine, ' ', ATTR(UiEditBoxTextColor, UiEditBoxBgColor)); // Show the cursor EditBoxCursorX = EditBoxStartX; MachVideoSetTextCursorPosition(EditBoxCursorX, EditBoxLine); MachVideoHideShowTextCursor(TRUE); // Draw status text UiDrawStatusText("Press ENTER to continue, or ESC to cancel"); VideoCopyOffScreenBufferToVRAM(); for (;;) { if (MachConsKbHit()) { key = MachConsGetCh(); if(key == KEY_EXTENDED) { key = MachConsGetCh(); } if(key == KEY_ENTER) { ReturnCode = TRUE; break; } else if(key == KEY_ESC) { ReturnCode = FALSE; break; } else if (key == KEY_BACKSPACE) // Remove a character { if (EditBoxTextCount) { EditBoxTextCount--; EditTextBuffer[EditBoxTextCount] = 0; } else { MachBeep(); } } else // Add this key to the buffer { if (EditBoxTextCount < Length - 1) { EditTextBuffer[EditBoxTextCount] = key; EditBoxTextCount++; EditTextBuffer[EditBoxTextCount] = 0; } else { MachBeep(); } } } // Draw the edit box background UiFillArea(EditBoxStartX, EditBoxLine, EditBoxEndX, EditBoxLine, ' ', ATTR(UiEditBoxTextColor, UiEditBoxBgColor)); // Fill the text in if (EditBoxTextCount > (EditBoxEndX - EditBoxStartX)) { EditBoxTextDisplayIndex = EditBoxTextCount - (EditBoxEndX - EditBoxStartX); EditBoxCursorX = EditBoxEndX; } else { EditBoxTextDisplayIndex = 0; EditBoxCursorX = EditBoxStartX + EditBoxTextCount; } UiDrawText(EditBoxStartX, EditBoxLine, &EditTextBuffer[EditBoxTextDisplayIndex], ATTR(UiEditBoxTextColor, UiEditBoxBgColor)); // Move the cursor MachVideoSetTextCursorPosition(EditBoxCursorX, EditBoxLine); TuiUpdateDateTime(); VideoCopyOffScreenBufferToVRAM(); } // Hide the cursor again MachVideoHideShowTextCursor(FALSE); // Restore the screen contents TuiRestoreScreen(ScreenBuffer); MmHeapFree(ScreenBuffer); return ReturnCode; }
VOID TuiMessageBoxCritical(PCSTR MessageText) { int width = 8; unsigned int height = 1; int curline = 0; int k; size_t i , j; int x1, x2, y1, y2; char temp[260]; char key; // Find the height for (i=0; i<strlen(MessageText); i++) { if (MessageText[i] == '\n') height++; } // Find the width for (i=0,j=0,k=0; i<height; i++) { while ((MessageText[j] != '\n') && (MessageText[j] != 0)) { j++; k++; } if (k > width) width = k; k = 0; j++; } // Calculate box area x1 = (UiScreenWidth - (width+2))/2; x2 = x1 + width + 3; y1 = ((UiScreenHeight - height - 2)/2) + 1; y2 = y1 + height + 4; // Draw the box TuiDrawBox(x1, y1, x2, y2, D_VERT, D_HORZ, TRUE, TRUE, ATTR(UiMessageBoxFgColor, UiMessageBoxBgColor)); // Draw the text for (i=0,j=0; i<strlen(MessageText)+1; i++) { if ((MessageText[i] == '\n') || (MessageText[i] == 0)) { temp[j] = 0; j = 0; UiDrawText(x1+2, y1+1+curline, temp, ATTR(UiMessageBoxFgColor, UiMessageBoxBgColor)); curline++; } else temp[j++] = MessageText[i]; } // Draw OK button strcpy(temp, " OK "); UiDrawText(x1+((x2-x1)/2)-3, y2-2, temp, ATTR(COLOR_BLACK, COLOR_GRAY)); // Draw status text UiDrawStatusText("Press ENTER to continue"); VideoCopyOffScreenBufferToVRAM(); for (;;) { if (MachConsKbHit()) { key = MachConsGetCh(); if(key == KEY_EXTENDED) key = MachConsGetCh(); if(key == KEY_ENTER) break; else if(key == KEY_SPACE) break; else if(key == KEY_ESC) break; } TuiUpdateDateTime(); VideoCopyOffScreenBufferToVRAM(); } }