1 local color = minetest.colorize
4 style_type[label,button,image_button,item_image_button,
5 tabheader,scrollbar,table,animated_image
6 ,field,textarea,checkbox,dropdown;noclip=%c]
8 label[0,0;A clipping test]
9 button[0,1;3,0.8;clip_button;A clipping test]
10 image_button[0,2;3,0.8;testformspec_button_image.png;clip_image_button;A clipping test]
11 item_image_button[0,3;3,0.8;testformspec:item;clip_item_image_button;A clipping test]
12 tabheader[0,4.7;3,0.63;clip_tabheader;Clip,Test,Text,Tabs;1;false;false]
13 field[0,5;3,0.8;clip_field;Title;]
14 textarea[0,6;3,1;clip_textarea;Title;]
15 checkbox[0,7.5;clip_checkbox;This is a test;true]
16 dropdown[0,8;3,0.8;clip_dropdown;Select An Item,One,Two,Three,Four,Five;1]
17 scrollbar[0,9;3,0.8;horizontal;clip_scrollbar;3]
18 tablecolumns[text;text]
19 table[0,10;3,1;clip_table;one,two,three,four;1]
20 animated_image[-0.5,11;4.5,1;clip_animated_image;testformspec_animation.png;4;100]
23 local tabheaders_fs = [[
24 tabheader[0,0;10,0.63;tabs_opaque;Opaque,Without,Border;1;false;false]
25 tabheader[0,1;10,0.63;tabs_opaque_border;Opaque,With,Border;1;false;true]
26 tabheader[0,2;10,0.63;tabs_transparent;Transparent,Without,Border;1;true;false]
27 tabheader[0,3;10,0.63;tabs_transparent_border;Transparent,With,Border;1;true;true]
28 tabheader[0,4;tabs_default;Default,Tabs;1]
29 tabheader[0,6;10,0.5;tabs_size1;Height=0.5;1;false;false]
30 tabheader[2,6;10,0.75;tabs_size1;Height=0.75;1;false;false]
31 tabheader[4,6;10,1;tabs_size2;Height=1;1;false;false]
32 tabheader[6,6;10,1.25;tabs_size2;Height=1.25;1;false;false]
33 tabheader[8,6;10,1.5;tabs_size2;Height=1.5;1;false;false]
36 local inv_style_fs = [[
37 style_type[list;noclip=true]
38 list[current_player;main;-1.125,-1.125;2,2]
39 style_type[list;spacing=.25,.125;size=.75,.875]
40 list[current_player;main;3,.5;3,3]
41 style_type[list;spacing=0;size=1]
42 list[current_player;main;.5,4;8,4]
45 local hypertext_basic = [[
46 <bigger>Normal test</bigger>
47 This is a normal text.
49 <bigger><mono>style</mono> test</bigger>
50 <style color=#FFFF00>Yellow text.</style> <style color=#FF0000>Red text.</style>
51 <style size=24>Size 24.</style> <style size=16>Size 16</style>. <style size=12>Size 12.</style>
52 <style font=normal>Normal font.</style> <style font=mono>Mono font.</style>
54 <bigger>Tag test</bigger>
55 <normal>normal</normal>
61 <bigger>bigger</bigger>
63 <center>center</center>
65 <justify>justify. Here comes a blind text: Lorem testum dolor sit amet consecutor celeron fiftifahivus e shadoninia e smalus jokus anrus relsocutoti rubenwardus. Erasputinus hara holisti dominus wusi. Grumarinsti erltusmuate ol fortitusti fla flo, blani burki e sfani fahif. Ultae ratii, e megus gigae don anonimus. Grinus dimondus krockus e nore. Endus finalus nowus comus endus o blindus tekstus.</justify>
67 <bigger>Custom tag test</bigger>
68 <tag name=t_green color=green>
69 <tag name=t_hover hovercolor=yellow>
70 <tag name=t_size size=24>
71 <tag name=t_mono font=mono>
72 <tag name=t_multi color=green font=mono size=24>
73 <t_green>color=green</t_green>
74 Action: <action name=color><t_green>color=green</t_green></action>
75 Action: <action name=hovercolor><t_hover>hovercolor=yellow</t_hover></action>
76 <t_size>size=24</t_size>
77 <t_mono>font=mono</t_mono>
78 <t_multi>color=green font=mono size=24</t_multi>
80 <bigger><mono>action</mono> test</bigger>
81 <action name=action_test>action</action>
83 <bigger><mono>img</mono> test</bigger>
85 <img name=testformspec_item.png>
86 <mono>width=48 height=48</mono>:
87 <img name=testformspec_item.png width=48 height=48>
88 <mono>float=left</mono>:
89 <img name=testformspec_item.png float=left>
90 <mono>float=right</mono>:
91 <img name=testformspec_item.png float=right>
93 <bigger><mono>item</mono> test</bigger>
95 <item name=testformspec:node>
96 <mono>width=48 height=48</mono>
97 <item name=testformspec:node width=48 height=48>
98 <mono>angle=30,0,0</mono>:
99 <item name=testformspec:node angle=30,0,0>
100 <mono>angle=0,30,0</mono>:
101 <item name=testformspec:node angle=0,30,0>
102 <mono>angle=0,0,30</mono>:
103 <item name=testformspec:node angle=0,0,30>
104 <mono>rotate=yes</mono>:
105 <item name=testformspec:node rotate=yes>
106 <mono>rotate=100,0,0</mono>:
107 <item name=testformspec:node rotate=100,0,0>
108 <mono>rotate=0,100,0</mono>:
109 <item name=testformspec:node rotate=0,100,0>
110 <mono>rotate=0,0,100</mono>:
111 <item name=testformspec:node rotate=0,0,100>
112 <mono>rotate=50,75,100</mono>:
113 <item name=testformspec:node rotate=50,75,100>
114 <mono>angle=-30,-45,90 rotate=100,150,-50</mono>:
115 <item name=testformspec:node angle=-30,-45,90 rotate=100,150,-50>]]
117 local hypertext_global = [[
118 <global background=gray margin=20 valign=bottom halign=right color=pink hovercolor=purple size=12 font=mono>
119 This is a test of the global tag. The parameters are:
120 background=gray margin=20 valign=bottom halign=right color=pink hovercolor=purple size=12 font=mono
121 <action name=global>action</action>]]
123 local hypertext_fs = "hypertext[0,0;11,9;hypertext;"..minetest.formspec_escape(hypertext_basic).."]"..
124 "hypertext[0,9.5;11,2.5;hypertext;"..minetest.formspec_escape(hypertext_global).."]"
127 style[one_btn1;bgcolor=red;textcolor=yellow;bgcolor_hovered=orange;
128 bgcolor_pressed=purple]
129 button[0,0;2.5,0.8;one_btn1;Button]
131 style[one_btn2;border=false;textcolor=cyan] ]]..
132 "button[0,1.05;2.5,0.8;one_btn2;Text " .. color("#FF0", "Yellow") .. [[]
134 style[one_btn3;bgimg=testformspec_button_image.png;bgimg_hovered=testformspec_hovered.png;
135 bgimg_pressed=testformspec_pressed.png]
136 button[0,2.1;1,1;one_btn3;Border]
138 style[one_btn4;bgimg=testformspec_button_image.png;bgimg_hovered=testformspec_hovered.png;
139 bgimg_pressed=testformspec_pressed.png;border=false]
140 button[1.25,2.1;1,1;one_btn4;NoBor]
142 style[one_btn5;bgimg=testformspec_button_image.png;bgimg_hovered=testformspec_hovered.png;
143 bgimg_pressed=testformspec_pressed.png;border=false;alpha=false]
144 button[0,3.35;1,1;one_btn5;Alph]
146 style[one_btn6;border=true]
147 image_button[0,4.6;1,1;testformspec_button_image.png;one_btn6;Border]
149 style[one_btn7;border=false]
150 image_button[1.25,4.6;1,1;testformspec_button_image.png;one_btn7;NoBor]
152 style[one_btn8;border=false]
153 image_button[0,5.85;1,1;testformspec_button_image.png;one_btn8;Border;false;true;testformspec_pressed.png]
155 style[one_btn9;border=true]
156 image_button[1.25,5.85;1,1;testformspec_button_image.png;one_btn9;NoBor;false;false;testformspec_pressed.png]
158 style[one_btn10;alpha=false]
159 image_button[0,7.1;1,1;testformspec_button_image.png;one_btn10;NoAlpha]
161 style[one_btn11;alpha=true]
162 image_button[1.25,7.1;1,1;testformspec_button_image.png;one_btn11;Alpha]
164 style[one_btn12;border=true]
165 item_image_button[0,8.35;1,1;testformspec:item;one_btn12;Border]
167 style[one_btn13;border=false]
168 item_image_button[1.25,8.35;1,1;testformspec:item;one_btn13;NoBor]
170 style[one_btn14;border=false;bgimg=testformspec_bg.png;fgimg=testformspec_button_image.png]
171 style[one_btn14:hovered;bgimg=testformspec_bg_hovered.png;fgimg=testformspec_hovered.png;textcolor=yellow]
172 style[one_btn14:pressed;bgimg=testformspec_bg_pressed.png;fgimg=testformspec_pressed.png;textcolor=blue]
173 style[one_btn14:hovered+pressed;textcolor=purple]
174 image_button[0,9.6;1,1;testformspec_button_image.png;one_btn14;Bg]
176 style[one_btn15;border=false;bgcolor=#1cc;bgimg=testformspec_bg.png;bgimg_hovered=testformspec_bg_hovered.png;bgimg_pressed=testformspec_bg_pressed.png]
177 item_image_button[1.25,9.6;1,1;testformspec:item;one_btn15;Bg]
179 style[one_btn16;border=false;bgimg=testformspec_bg_9slice.png;bgimg_hovered=testformspec_bg_9slice_hovered.png;bgimg_pressed=testformspec_bg_9slice_pressed.png;bgimg_middle=4,6]
180 button[2.5,9.6;2,1;one_btn16;9-Slice Bg]
186 style[one_tb1;textcolor=Yellow]
187 tabheader[0,3;2.5,0.63;one_tb1;Yellow,Text,Tabs;1;false;false]
189 style[one_f1;textcolor=yellow]
190 field[0,4.25;2.5,0.8;one_f1;Field One;Yellow Text]
192 style[one_f2;border=false;textcolor=cyan]
193 field[0,5.75;2.5,0.8;one_f2;Field Two;Borderless Cyan Text]
195 style[one_f3;textcolor=yellow]
196 textarea[0,7.025;2.5,0.8;one_f3;Label;]] ..
197 minetest.formspec_escape("Yellow Text\nLine two") .. [[ ]
199 style[one_f4;border=false;textcolor=cyan]
200 textarea[0,8.324999999999999;2.5,0.8;one_f4;Label;]] ..
201 minetest.formspec_escape("Borderless Cyan Text\nLine two") .. [[ ]
207 "button[8.5,1;4,1;outside;Outside of container]"..
208 "box[1,1;8,6;#00aa]"..
209 "scroll_container[1,1;8,6;scrbar;vertical]"..
210 "button[0,1;1,1;lorem;Lorem]"..
211 "button[0,10;1,1;ipsum;Ipsum]"..
212 "pwdfield[2,2;1,1;lorem2;Lorem]"..
213 "list[current_player;main;4,4;1,5;]"..
214 "box[2,5;3,2;#ffff00]"..
215 "image[1,10;3,2;testformspec_item.png]"..
216 "image[3,1;testformspec_item.png]"..
217 "item_image[2,6;3,2;testformspec:node]"..
218 "label[2,15;bla Bli\nfoo bar]"..
219 "item_image_button[2,3;1,1;testformspec:node;itemimagebutton;ItemImageButton]"..
220 "tooltip[0,11;3,2;Buz;#f00;#000]"..
221 "box[0,11;3,2;#00ff00]"..
222 "hypertext[3,13;3,3;;" .. hypertext_basic .. "]" ..
224 "box[1,2;3,2;#0a0a]"..
225 "scroll_container[1,2;3,2;scrbar2;horizontal;0.06]"..
226 "button[0,0;6,1;butnest;Nest]"..
227 "label[10,0.5;nest]"..
228 "scroll_container_end[]"..
229 "scrollbar[1,0;3.5,0.3;horizontal;scrbar2;0]"..
231 "dropdown[0,6;2;hmdrpdwn;apple,bulb;1]"..
232 "image_button[0,4;2,2;testformspec_button_image.png;imagebutton;bbbbtt;false;true;testformspec_pressed.png]"..
233 "box[1,22.5;4,1;#a00a]"..
234 "scroll_container_end[]"..
235 "scrollbaroptions[max=170]".. -- lowest seen pos is: 0.1*170+6=23 (factor*max+height)
236 "scrollbar[7.5,0;0.3,4;vertical;scrbar;0]"..
237 "scrollbar[8,0;0.3,4;vertical;scrbarhmmm;0]"..
238 "dropdown[0,6;2;hmdrpdwnnn;Outside,of,container;1]"
240 --style_type[label;textcolor=green]
242 --style_type[label;textcolor=blue]
244 --style_type[label;textcolor=;border=true]
245 --label[1.2,0;Border]
246 --style_type[label;border=true;bgcolor=red]
247 --label[1.2,1;Background]
248 --style_type[label;border=;bgcolor=]
249 --label[0.75,2;Reset]
257 image_button[0,0;1,1;logo.png;rc_image_button_1x1;1x1]
258 image_button[1,0;2,2;logo.png;rc_image_button_2x2;2x2]
259 button[0,2;1,1;rc_button_1x1;1x1]
260 button[1,2;2,2;rc_button_2x2;2x2]
261 item_image[0,4;1,1;air]
262 item_image[1,4;2,2;air]
263 item_image_button[0,6;1,1;testformspec:node;rc_item_image_button_1x1;1x1]
264 item_image_button[1,6;2,2;testformspec:node;rc_item_image_button_2x2;2x2]
265 field[3,.5;3,.5;rc_field;Field;text]
266 pwdfield[6,.5;3,1;rc_pwdfield;Password Field]
267 field[3,1;3,1;;Read-Only Field;text]
268 textarea[3,2;3,.5;rc_textarea_small;Textarea;text]
269 textarea[6,2;3,2;rc_textarea_big;Textarea;text\nmore text]
270 textarea[3,3;3,1;;Read-Only Textarea;text\nmore text]
271 textlist[3,4;3,2;rc_textlist;Textlist,Perfect Coordinates;1;false]
272 tableoptions[highlight=#ABCDEF75;background=#00000055;border=false]
273 table[6,4;3,2;rc_table;Table,Cool Stuff,Foo,Bar;2]
274 dropdown[3,6;3,1;rc_dropdown_small;This,is,a,dropdown;1]
275 dropdown[6,6;3,2;rc_dropdown_big;I,am,a,bigger,dropdown;5]
276 image[0,8;3,2;ignore.png]
278 checkbox[3,8;rc_checkbox_1;Check me!;false]
279 checkbox[3,9;rc_checkbox_2;Uncheck me now!;true]
280 scrollbar[0,11.5;11.5,.5;horizontal;rc_scrollbar_horizontal;500]
281 scrollbar[11.5,0;.5,11.5;vertical;rc_scrollbar_vertical;0]
282 list[current_player;main;6,8;3,2;1]
283 button[9,0;2.5,1;rc_empty_button_1;]
284 button[9,1;2.5,1;rc_empty_button_2;]
285 button[9,2;2.5,1;rc_empty_button_3;] ]]..
286 "label[9,0.5;This is a label.\nLine\nLine\nLine\nEnd]"..
287 [[button[9,3;1,1;rc_empty_button_4;]
290 tabheader[8,0;6,0.65;rc_tabheader;Tab 1,Tab 2,Tab 3,Secrets;1;false;false]
294 "formspec_version[3]size[12,13]" ..
295 ("label[0.375,0.375;Styled - %s %s]"):format(
296 color("#F00", "red text"),
297 color("#77FF00CC", "green text")) ..
298 "label[6.375,0.375;Unstyled]" ..
299 "box[0,0.75;12,0.1;#999]" ..
300 "box[6,0.85;0.1,11.15;#999]" ..
301 "container[0.375,1.225]" ..
303 "container_end[]container[6.375,1.225]" ..
304 style_fs:gsub("one_", "two_"):gsub("style%[[^%]]+%]", ""):gsub("style_type%[[^%]]+%]", "") ..
308 "formspec_version[3]size[12,13]" ..
309 "label[0.1,0.5;Clip]" ..
310 "container[-2.5,1]" .. clip_fs:gsub("%%c", "false") .. "container_end[]" ..
311 "label[11,0.5;Noclip]" ..
312 "container[11.5,1]" .. clip_fs:gsub("%%c", "true") .. "container_end[]",
315 "size[12,13]real_coordinates[true]" ..
316 "container[0.5,0.5]" .. hypertext_fs .. "container_end[]",
319 "size[12,13]real_coordinates[true]" ..
320 "container[0.5,1.5]" .. tabheaders_fs .. "container_end[]",
323 "size[12,13]real_coordinates[true]" ..
324 "container[0.5,1.5]" .. inv_style_fs .. "container_end[]",
330 animated_image[0.5,0.5;1,1;;testformspec_animation.png;4;100]
331 animated_image[0.5,1.75;1,1;;testformspec_animation.jpg;4;100]
332 animated_image[1.75,0.5;1,1;;testformspec_animation.png;100;100]
333 animated_image[3,0.5;1,1;ani_img_1;testformspec_animation.png;4;1000]
334 button[4.25,0.5;1,1;ani_btn_1;Current
336 animated_image[3,1.75;1,1;ani_img_2;testformspec_animation.png;4;1000;2]
337 button[4.25,1.75;1,1;ani_btn_2;Current
339 animated_image[3,3;1,1;;testformspec_animation.png;4;0]
340 animated_image[3,4.25;1,1;;testformspec_animation.png;4;0;3]
341 animated_image[5.5,0.5;5,2;;testformspec_animation.png;4;100]
342 animated_image[5.5,2.75;5,2;;testformspec_animation.jpg;4;100]
344 style[m1;bgcolor=black]
345 model[0.5,6;4,4;m1;testformspec_character.b3d;testformspec_character.png]
346 model[5,6;4,4;m2;testformspec_chest.obj;default_chest_top.png,default_chest_top.png,default_chest_side.png,default_chest_side.png,default_chest_front.png,default_chest_inside.png;30,1;true;true]
350 "formspec_version[3]size[12,13]" ..
354 local function show_test_formspec(pname, page_id)
355 page_id = page_id or 2
357 local fs = pages[page_id] .. "tabheader[0,0;8,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Invs,Anim,ScrollC;" .. page_id .. ";false;false]"
359 minetest.show_formspec(pname, "testformspec:formspec", fs)
362 minetest.register_on_player_receive_fields(function(player, formname, fields)
363 if formname ~= "testformspec:formspec" then
368 if fields.maintabs then
369 show_test_formspec(player:get_player_name(), tonumber(fields.maintabs))
373 if fields.ani_img_1 and fields.ani_btn_1 then
374 minetest.chat_send_player(player:get_player_name(), "ani_img_1 = " .. tostring(fields.ani_img_1))
376 elseif fields.ani_img_2 and fields.ani_btn_2 then
377 minetest.chat_send_player(player:get_player_name(), "ani_img_2 = " .. tostring(fields.ani_img_2))
381 if fields.hypertext then
382 minetest.chat_send_player(player:get_player_name(), "Hypertext action received: " .. tostring(fields.hypertext))
387 minetest.register_chatcommand("test_formspec", {
389 description = "Open the test formspec",
390 func = function(name)
391 if not minetest.get_player_by_name(name) then
392 return false, "You need to be online!"
395 show_test_formspec(name)