VOID TuiDrawStatusText(PCSTR StatusText) { ULONG i; TuiDrawText(0, UiScreenHeight-1, " ", ATTR(UiStatusBarFgColor, UiStatusBarBgColor)); TuiDrawText(1, UiScreenHeight-1, StatusText, ATTR(UiStatusBarFgColor, UiStatusBarBgColor)); for (i=strlen(StatusText)+1; i<UiScreenWidth; i++) { TuiDrawText(i, UiScreenHeight-1, " ", ATTR(UiStatusBarFgColor, UiStatusBarBgColor)); } VideoCopyOffScreenBufferToVRAM(); }
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(); }
VOID TuiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR TextString, UCHAR Attr) { ULONG TextLength; ULONG BoxWidth; ULONG BoxHeight; ULONG LineBreakCount; ULONG Index; ULONG LastIndex; ULONG RealLeft; ULONG RealTop; ULONG X; ULONG Y; CHAR Temp[2]; TextLength = strlen(TextString); // Count the new lines and the box width LineBreakCount = 0; BoxWidth = 0; LastIndex = 0; for (Index=0; Index<TextLength; Index++) { if (TextString[Index] == '\n') { LastIndex = Index; LineBreakCount++; } else { if ((Index - LastIndex) > BoxWidth) { BoxWidth = (Index - LastIndex); } } } BoxHeight = LineBreakCount + 1; RealLeft = (((Right - Left) - BoxWidth) / 2) + Left; RealTop = (((Bottom - Top) - BoxHeight) / 2) + Top; LastIndex = 0; for (Index=0; Index<TextLength; Index++) { if (TextString[Index] == '\n') { RealTop++; LastIndex = 0; } else { X = RealLeft + LastIndex; Y = RealTop; LastIndex++; Temp[0] = TextString[Index]; Temp[1] = 0; TuiDrawText(X, Y, Temp, Attr); } } }
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(); }
VOID TuiUpdateDateTime(VOID) { TIMEINFO* TimeInfo; char DateString[40]; CHAR TimeString[40]; CHAR TempString[20]; BOOLEAN PMHour = FALSE; /* Don't draw the time if this has been disabled */ if (!UiDrawTime) return; TimeInfo = ArcGetTime(); if (TimeInfo->Year < 1 || 9999 < TimeInfo->Year || TimeInfo->Month < 1 || 12 < TimeInfo->Month || TimeInfo->Day < 1 || 31 < TimeInfo->Day || 23 < TimeInfo->Hour || 59 < TimeInfo->Minute || 59 < TimeInfo->Second) { /* This happens on QEmu sometimes. We just skip updating */ return; } // Get the month name strcpy(DateString, UiMonthNames[TimeInfo->Month - 1]); // Get the day _itoa(TimeInfo->Day, TempString, 10); // Get the day postfix if (1 == TimeInfo->Day || 21 == TimeInfo->Day || 31 == TimeInfo->Day) { strcat(TempString, "st"); } else if (2 == TimeInfo->Day || 22 == TimeInfo->Day) { strcat(TempString, "nd"); } else if (3 == TimeInfo->Day || 23 == TimeInfo->Day) { strcat(TempString, "rd"); } else { strcat(TempString, "th"); } // Add the day to the date strcat(DateString, TempString); strcat(DateString, " "); // Get the year and add it to the date _itoa(TimeInfo->Year, TempString, 10); strcat(DateString, TempString); // Draw the date TuiDrawText(UiScreenWidth-strlen(DateString)-2, 1, DateString, ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); // Get the hour and change from 24-hour mode to 12-hour if (TimeInfo->Hour > 12) { TimeInfo->Hour -= 12; PMHour = TRUE; } if (TimeInfo->Hour == 0) { TimeInfo->Hour = 12; } _itoa(TimeInfo->Hour, TempString, 10); strcpy(TimeString, " "); strcat(TimeString, TempString); strcat(TimeString, ":"); _itoa(TimeInfo->Minute, TempString, 10); if (TimeInfo->Minute < 10) { strcat(TimeString, "0"); } strcat(TimeString, TempString); strcat(TimeString, ":"); _itoa(TimeInfo->Second, TempString, 10); if (TimeInfo->Second < 10) { strcat(TimeString, "0"); } strcat(TimeString, TempString); if (PMHour) { strcat(TimeString, " PM"); } else { strcat(TimeString, " AM"); } // Draw the time TuiDrawText(UiScreenWidth-strlen(TimeString)-2, 2, TimeString, ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); }