[FREELDR]
[reactos.git] / reactos / boot / freeldr / freeldr / ui / minitui.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: FreeLoader
4 * FILE: 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 TuiDrawCenteredText,
147 MiniTuiDrawStatusText,
148 TuiUpdateDateTime,
149 TuiMessageBox,
150 TuiMessageBoxCritical,
151 MiniTuiDrawProgressBarCenter,
152 MiniTuiDrawProgressBar,
153 TuiEditBox,
154 TuiTextToColor,
155 TuiTextToFillStyle,
156 MiniTuiDrawBackdrop, /* no FadeIn */
157 TuiFadeOut,
158 TuiDisplayMenu,
159 MiniTuiDrawMenu,
160 };
161 #endif