[BOOT] Improve the FILE header section. Brought to you by Adam Stachowicz. CORE-10114
[reactos.git] / reactos / boot / freeldr / freeldr / ui / minitui.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: FreeLoader
4 * FILE: boot/freeldr/freeldr/ui/minitui.c
5 * PURPOSE: Mini Text UI interface
6 * PROGRAMMERS: Brian Palmer <brianp@sginet.com>
7 * Hervé Poussineau
8 */
9 #ifndef _M_ARM
10 #include <freeldr.h>
11
12 VOID MiniTuiDrawBackdrop(VOID)
13 {
14 //
15 // Fill in a black background
16 //
17 TuiFillArea(0, 0, UiScreenWidth - 1, UiScreenHeight - 1, 0, 0);
18
19 //
20 // Update the screen buffer
21 //
22 VideoCopyOffScreenBufferToVRAM();
23 }
24
25 VOID MiniTuiDrawStatusText(PCSTR StatusText)
26 {
27 //
28 // Minimal UI doesn't have a status bar
29 //
30 }
31
32 VOID MiniTuiDrawProgressBarCenter(ULONG Position, ULONG Range, PCHAR ProgressText)
33 {
34 ULONG Left, Top, Right, Bottom;
35 ULONG Width = 50; // Allow for 50 "bars"
36 ULONG Height = 2;
37
38 Width = 80;
39 Left = 0;
40 Right = Left + Width;
41 Top = UiScreenHeight - Height - 4;
42 Bottom = Top + Height + 1;
43
44 MiniTuiDrawProgressBar(Left, Top, Right, Bottom, Position, Range, ProgressText);
45 }
46
47 VOID MiniTuiDrawProgressBar(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, ULONG Position, ULONG Range, PCHAR ProgressText)
48 {
49 ULONG i;
50 ULONG ProgressBarWidth = (Right - Left) - 4;
51
52 // First make sure the progress bar text fits
53 UiTruncateStringEllipsis(ProgressText, ProgressBarWidth - 4);
54
55 if (Position > Range)
56 {
57 Position = Range;
58 }
59
60 //
61 // Draw the "Loading..." text
62 //
63 TuiDrawCenteredText(Left + 2, Top + 1, Right - 2, Top + 1, ProgressText, ATTR(7, 0));
64
65 // Draw the percent complete
66 for (i=0; i<(Position*ProgressBarWidth)/Range; i++)
67 {
68 TuiDrawText(Left+2+i, Top+2, "\xDB", ATTR(UiTextColor, UiMenuBgColor));
69 }
70
71 TuiUpdateDateTime();
72 VideoCopyOffScreenBufferToVRAM();
73 }
74
75 VOID
76 MiniTuiDrawMenu(PUI_MENU_INFO MenuInfo)
77 {
78 ULONG i;
79
80 //
81 // Draw the backdrop
82 //
83 UiDrawBackdrop();
84
85 //
86 // No GUI status bar text, just minimal text. Show the menu header.
87 //
88 UiVtbl.DrawText(0,
89 MenuInfo->Top - 2,
90 MenuInfo->MenuHeader,
91 ATTR(UiMenuFgColor, UiMenuBgColor));
92
93 //
94 // Now tell the user how to choose
95 //
96 UiVtbl.DrawText(0,
97 MenuInfo->Bottom + 1,
98 "Use \x18 and \x19 to move the highlight to your choice.",
99 ATTR(UiMenuFgColor, UiMenuBgColor));
100 UiVtbl.DrawText(0,
101 MenuInfo->Bottom + 2,
102 "Press ENTER to choose.",
103 ATTR(UiMenuFgColor, UiMenuBgColor));
104
105 //
106 // And show the menu footer
107 //
108 UiVtbl.DrawText(0,
109 UiScreenHeight - 4,
110 MenuInfo->MenuFooter,
111 ATTR(UiMenuFgColor, UiMenuBgColor));
112
113 //
114 // Draw the menu box
115 //
116 TuiDrawMenuBox(MenuInfo);
117
118 //
119 // Draw each line of the menu
120 //
121 for (i = 0; i < MenuInfo->MenuItemCount; i++)
122 {
123 TuiDrawMenuItem(MenuInfo, i);
124 }
125
126 //
127 // Display the boot options if needed
128 //
129 if (MenuInfo->ShowBootOptions)
130 {
131 DisplayBootTimeOptions();
132 }
133
134 VideoCopyOffScreenBufferToVRAM();
135 }
136
137 const UIVTBL MiniTuiVtbl =
138 {
139 TuiInitialize,
140 TuiUnInitialize,
141 MiniTuiDrawBackdrop,
142 TuiFillArea,
143 TuiDrawShadow,
144 TuiDrawBox,
145 TuiDrawText,
146 TuiDrawText2,
147 TuiDrawCenteredText,
148 MiniTuiDrawStatusText,
149 TuiUpdateDateTime,
150 TuiMessageBox,
151 TuiMessageBoxCritical,
152 MiniTuiDrawProgressBarCenter,
153 MiniTuiDrawProgressBar,
154 TuiEditBox,
155 TuiTextToColor,
156 TuiTextToFillStyle,
157 MiniTuiDrawBackdrop, /* no FadeIn */
158 TuiFadeOut,
159 TuiDisplayMenu,
160 MiniTuiDrawMenu,
161 };
162 #endif