xref: /freebsd/stand/lua/drawer.lua (revision 196ba16663396a420a5683db541050203e03f3a1)
1--
2-- Copyright (c) 2015 Pedro Souza <pedrosouza@freebsd.org>
3-- All rights reserved.
4--
5-- Redistribution and use in source and binary forms, with or without
6-- modification, are permitted provided that the following conditions
7-- are met:
8-- 1. Redistributions of source code must retain the above copyright
9--    notice, this list of conditions and the following disclaimer.
10-- 2. Redistributions in binary form must reproduce the above copyright
11--    notice, this list of conditions and the following disclaimer in the
12--    documentation and/or other materials provided with the distribution.
13--
14-- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15-- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17-- ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22-- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23-- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24-- SUCH DAMAGE.
25--
26-- $FreeBSD$
27--
28
29local drawer = {};
30
31local color = require("color");
32local screen = require("screen");
33
34drawer.brand_position = {x = 2, y = 1};
35drawer.fbsd_logo = {
36	"  ______               ____   _____ _____  ",
37	" |  ____|             |  _ \\ / ____|  __ \\ ",
38	" | |___ _ __ ___  ___ | |_) | (___ | |  | |",
39	" |  ___| '__/ _ \\/ _ \\|  _ < \\___ \\| |  | |",
40	" | |   | | |  __/  __/| |_) |____) | |__| |",
41	" | |   | | |    |    ||     |      |      |",
42	" |_|   |_|  \\___|\\___||____/|_____/|_____/ "
43};
44
45drawer.logo_position = {x = 46, y = 1};
46drawer.beastie_color = {
47	"               \027[31m,        ,",
48	"              /(        )`",
49	"              \\ \\___   / |",
50	"              /- \027[37m_\027[31m  `-/  '",
51	"             (\027[37m/\\/ \\\027[31m \\   /\\",
52	"             \027[37m/ /   |\027[31m `    \\",
53	"             \027[34mO O   \027[37m) \027[31m/    |",
54	"             \027[37m`-^--'\027[31m`<     '",
55	"            (_.)  _  )   /",
56	"             `.___/`    /",
57	"               `-----' /",
58	"  \027[33m<----.\027[31m     __ / __   \\",
59	"  \027[33m<----|====\027[31mO)))\027[33m==\027[31m) \\) /\027[33m====|",
60	"  \027[33m<----'\027[31m    `--' `.__,' \\",
61	"               |        |",
62	"                \\       /       /\\",
63	"           \027[36m______\027[31m( (_  / \\______/",
64	"         \027[36m,'  ,-----'   |",
65	"         `--{__________)\027[37m"
66};
67
68drawer.beastie = {
69	"               ,        ,",
70	"              /(        )`",
71	"              \\ \\___   / |",
72	"              /- _  `-/  '",
73	"             (/\\/ \\ \\   /\\",
74	"             / /   | `    \\",
75	"             O O   ) /    |",
76	"             `-^--'`<     '",
77	"            (_.)  _  )   /",
78	"             `.___/`    /",
79	"               `-----' /",
80	"  <----.     __ / __   \\",
81	"  <----|====O)))==) \\) /====|",
82	"  <----'    `--' `.__,' \\",
83	"               |        |",
84	"                \\       /       /\\",
85	"           ______( (_  / \\______/",
86	"         ,'  ,-----'   |",
87	"         `--{__________)"
88};
89
90drawer.fbsd_logo_shift = {x = 5, y = 4};
91drawer.fbsd_logo_v = {
92	"  ______",
93	" |  ____| __ ___  ___ ",
94	" | |__ | '__/ _ \\/ _ \\",
95	" |  __|| | |  __/  __/",
96	" | |   | | |    |    |",
97	" |_|   |_|  \\___|\\___|",
98	"  ____   _____ _____",
99	" |  _ \\ / ____|  __ \\",
100	" | |_) | (___ | |  | |",
101	" |  _ < \\___ \\| |  | |",
102	" | |_) |____) | |__| |",
103	" |     |      |      |",
104	" |____/|_____/|_____/"
105};
106
107drawer.orb_shift = {x = 2, y = 4};
108drawer.orb_color = {
109	"  \027[31m```                        \027[31;1m`\027[31m",
110	" s` `.....---...\027[31;1m....--.```   -/\027[31m",
111	" +o   .--`         \027[31;1m/y:`      +.\027[31m",
112	"  yo`:.            \027[31;1m:o      `+-\027[31m",
113	"   y/               \027[31;1m-/`   -o/\027[31m",
114	"  .-                  \027[31;1m::/sy+:.\027[31m",
115	"  /                     \027[31;1m`--  /\027[31m",
116	" `:                          \027[31;1m:`\027[31m",
117	" `:                          \027[31;1m:`\027[31m",
118	"  /                          \027[31;1m/\027[31m",
119	"  .-                        \027[31;1m-.\027[31m",
120	"   --                      \027[31;1m-.\027[31m",
121	"    `:`                  \027[31;1m`:`",
122	"      \027[31;1m.--             `--.",
123	"         .---.....----.\027[37m"
124};
125
126drawer.orb = {
127	"  ```                        `",
128	" s` `.....---.......--.```   -/",
129	" +o   .--`         /y:`      +.",
130	"  yo`:.            :o      `+-",
131	"   y/               -/`   -o/",
132	"  .-                  ::/sy+:.",
133	"  /                     `--  /",
134	" `:                          :`",
135	" `:                          :`",
136	"  /                          /",
137	"  .-                        -.",
138	"   --                      -.",
139	"    `:`                  `:`",
140	"      .--             `--.",
141	"         .---.....----."
142};
143
144drawer.none = {""};
145
146drawer.none_shift = {x = 17, y = 0};
147
148drawer.menu_position = {x = 6, y = 11};
149
150drawer.box_pos_dim = {x = 3, y = 10, w = 41, h = 11};
151
152function drawer.drawscreen(menu_opts)
153	-- drawlogo() must go first.
154	-- it determines the positions of other elements
155	drawer.drawlogo();
156        drawer.drawbrand();
157        drawer.drawbox();
158	return drawer.drawmenu(menu_opts);
159end
160
161function drawer.drawmenu(m)
162	x = drawer.menu_position.x;
163	y = drawer.menu_position.y;
164
165	-- print the menu and build the alias table
166	local alias_table = {};
167	local entry_num = 0;
168	for line_num, e in ipairs(m) do
169		if (e.entry_type ~= "separator") then
170			entry_num = entry_num + 1;
171			screen.setcursor(x, y + line_num);
172			print(entry_num .. ". "..e.name());
173
174			-- fill the alias table
175			alias_table[tostring(entry_num)] = e;
176			if (e.alias ~= nil) then
177				for n, a in ipairs(e.alias) do
178					alias_table[a] = e;
179				end
180			end
181		else
182			screen.setcursor(x, y + line_num);
183			print(e.name());
184		end
185	end
186	return alias_table;
187end
188
189
190function drawer.drawbox()
191	x = drawer.box_pos_dim.x;
192	y = drawer.box_pos_dim.y;
193	w = drawer.box_pos_dim.w;
194	h = drawer.box_pos_dim.h;
195
196	local hl = string.char(0xCD);
197	local vl = string.char(0xBA);
198
199	local tl = string.char(0xC9);
200	local bl = string.char(0xC8);
201	local tr = string.char(0xBB);
202	local br = string.char(0xBC);
203
204	screen.setcursor(x, y); print(tl);
205	screen.setcursor(x, y+h); print(bl);
206	screen.setcursor(x+w, y); print(tr);
207	screen.setcursor(x+w, y+h); print(br);
208
209	for i = 1, w-1 do
210		screen.setcursor(x+i, y);
211		print(hl);
212		screen.setcursor(x+i, y+h);
213		print(hl);
214	end
215
216	for i = 1, h-1 do
217		screen.setcursor(x, y+i);
218		print(vl);
219		screen.setcursor(x+w, y+i);
220		print(vl);
221	end
222
223	screen.setcursor(x+(w/2)-9, y);
224	print("Welcome to FreeBSD");
225end
226
227function drawer.draw(x, y, logo)
228	for i = 1, #logo do
229		screen.setcursor(x, y + i);
230		print(logo[i]);
231	end
232end
233
234function drawer.drawbrand()
235	local x = tonumber(loader.getenv("loader_brand_x"));
236	local y = tonumber(loader.getenv("loader_brand_y"));
237
238	if not x then
239		x = drawer.brand_position.x;
240	end
241	if not y then
242		y = drawer.brand_position.y;
243	end
244
245	local logo = load("return " .. tostring(loader.getenv("loader_brand")))();
246	if not logo then
247		logo = drawer.fbsd_logo;
248	end
249	drawer.draw(x, y, logo);
250end
251
252function drawer.drawlogo()
253	local x = tonumber(loader.getenv("loader_logo_x"));
254	local y = tonumber(loader.getenv("loader_logo_y"));
255
256	if not x then
257		x = drawer.logo_position.x;
258	end
259	if not y then
260		y = drawer.logo_position.y;
261	end
262
263	local logo = loader.getenv("loader_logo");
264	local s = {x = 0, y = 0};
265	local colored = color.isEnabled();
266
267	if logo == "beastie" then
268		if colored then
269			logo = drawer.beastie_color;
270		end
271	elseif logo == "beastiebw" then
272		logo = drawer.beastie;
273	elseif logo == "fbsdbw" then
274		logo = drawer.fbsd_logo_v;
275		s = drawer.fbsd_logo_shift;
276	elseif logo == "orb" then
277		if colored then
278			logo = drawer.orb_color;
279		end
280		s = drawer.orb_shift;
281	elseif logo == "orbbw" then
282		logo = drawer.orb;
283		s = drawer.orb_shift;
284	elseif logo == "tribute" then
285		logo = drawer.fbsd_logo;
286	elseif logo == "tributebw" then
287		logo = drawer.fbsd_logo;
288	elseif logo == "none" then
289		--centre brand and text if no logo
290		drawer.brand_position.x = drawer.brand_position.x + drawer.none_shift.x;
291		drawer.brand_position.y = drawer.brand_position.y + drawer.none_shift.y;
292		drawer.menu_position.x = drawer.menu_position.x + drawer.none_shift.x;
293		drawer.menu_position.y = drawer.menu_position.y + drawer.none_shift.y;
294		drawer.box_pos_dim.x = drawer.box_pos_dim.x + drawer.none_shift.x;
295		drawer.box_pos_dim.y = drawer.box_pos_dim.y + drawer.none_shift.y;
296		--prevent redraws from moving menu further
297		drawer.none_shift.x = 0;
298		drawer.none_shift.y = 0;
299		logo = drawer.none;
300	end
301	if not logo then
302		if colored then
303			logo = drawer.orb_color;
304		else
305			logo = drawer.orb;
306		end
307	end
308	drawer.draw(x + s.x, y + s.y, logo);
309end
310
311return drawer
312