Add dropdown element.

This commit is contained in:
luk3yx 2020-02-06 20:35:17 +13:00
parent 843d70dcef
commit 4cbcad8178
5 changed files with 126 additions and 7 deletions

View File

@ -124,6 +124,12 @@ function fixers.list(elem, next_elem)
elem.type = 'container'
end
-- Remove the "height" attribute on dropdowns.
function fixers.dropdown(elem)
elem.h = nil
return default_fixer(elem)
end
--
local pre_types = {size = true, position = true, anchor = true,
no_prepend = true}

View File

@ -44,6 +44,7 @@ local property_names = {
h = 'Height',
w = 'Width',
drawborder = 'Draw border',
item = 'Items',
listelem = 'Items',
selected_idx = 'Selected item',
}
@ -217,6 +218,7 @@ do
button[0,0;3,0.75;;]
button_exit[0,0;3,0.75;;]
checkbox[0,0.2;;;false]
dropdown[0,0;5,0.75;;;1]
field[0,0;3,0.75;;;]
image[0,0;1,1;]
image_button[0,0;2,2;;;;false;true;]

View File

@ -204,6 +204,33 @@ function elems.textlist(node)
return res
end
function elems.dropdown(node, base, default_callbacks, scale)
local res = make('div')
if not node.h then
res.style.width = (node.w * scale) .. 'px'
res.style.height = (2 * 15/13 * 0.35 * scale) .. 'px'
end
local select = make('select')
for i, item in ipairs(node.item) do
local e = make('option', {textContent = item}, {name = i})
if i == node.selected_idx then
e:setAttribute('selected', 'selected')
end
select:appendChild(e)
end
window:setTimeout(function()
if res.classList:contains('formspec_ast-clickable') then
select:setAttribute('disabled', 'disabled')
end
end, 0)
res:appendChild(select)
local btn = make('div')
btn:appendChild(make('div'))
res:appendChild(btn)
return res
end
-- Make images - This uses HDX to simplify things
local image_baseurl = 'https://gitlab.com/VanessaE/hdx-128/raw/master/'
function renderer.make_image(name, allow_empty)

View File

@ -12,9 +12,10 @@
image-rendering: pixelated; }
.formspec_ast-base > div.grid {
background: url("grid.png"); }
.formspec_ast-base > div, .formspec_ast-base > div input, .formspec_ast-base > div textarea {
.formspec_ast-base > div, .formspec_ast-base > div input, .formspec_ast-base > div textarea, .formspec_ast-base > div select {
font-family: Arimo, sans-serif;
color: #FFFFFF; }
color: #FFFFFF;
font-size: inherit; }
.formspec_ast-base > div > * {
position: absolute;
font-size: 0.34em;
@ -40,7 +41,8 @@
background-color: #f002; }
.formspec_ast-base .formspec_ast-button, .formspec_ast-base .formspec_ast-button_exit,
.formspec_ast-base .formspec_ast-image_button[data-drawborder="true"],
.formspec_ast-base .formspec_ast-image_button_exit[data-drawborder="true"] {
.formspec_ast-base .formspec_ast-image_button_exit[data-drawborder="true"],
.formspec_ast-base .formspec_ast-dropdown > div {
box-sizing: border-box;
border: 1px solid #000;
background: #414141;
@ -51,11 +53,13 @@
justify-content: center; }
.formspec_ast-base .formspec_ast-button:hover, .formspec_ast-base .formspec_ast-button_exit:hover,
.formspec_ast-base .formspec_ast-image_button[data-drawborder="true"]:hover,
.formspec_ast-base .formspec_ast-image_button_exit[data-drawborder="true"]:hover {
.formspec_ast-base .formspec_ast-image_button_exit[data-drawborder="true"]:hover,
.formspec_ast-base .formspec_ast-dropdown > div:hover {
background: linear-gradient(180deg, #656565 0%, #383838 100%); }
.formspec_ast-base .formspec_ast-button:active, .formspec_ast-base .formspec_ast-button_exit:active,
.formspec_ast-base .formspec_ast-image_button[data-drawborder="true"]:active,
.formspec_ast-base .formspec_ast-image_button_exit[data-drawborder="true"]:active {
.formspec_ast-base .formspec_ast-image_button_exit[data-drawborder="true"]:active,
.formspec_ast-base .formspec_ast-dropdown > div:active {
background: linear-gradient(180deg, #464646 0%, #272727 100%); }
.formspec_ast-base .formspec_ast-image_button[data-drawborder="false"], .formspec_ast-base .formspec_ast-image_button_exit[data-drawborder="false"] {
background: none;
@ -139,6 +143,37 @@
padding: 2px;
padding-left: 5px;
padding-right: 5px; }
.formspec_ast-base .formspec_ast-dropdown {
border: 2px solid #1E1E1E;
box-sizing: border-box; }
.formspec_ast-base .formspec_ast-dropdown select {
border: none;
border-radius: 0;
background: #1E1E1E;
width: 100%;
height: 100%;
-moz-appearance: none;
-webkit-appearance: none;
appearance: none;
outline: none; }
.formspec_ast-base .formspec_ast-dropdown select:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 #fff; }
.formspec_ast-base .formspec_ast-dropdown select:focus {
background: #467832; }
.formspec_ast-base .formspec_ast-dropdown.formspec_ast-clickable select {
pointer-events: none; }
.formspec_ast-base .formspec_ast-dropdown > div {
position: absolute;
top: 0;
right: 0;
width: 15px;
height: 100%;
pointer-events: none; }
.formspec_ast-base .formspec_ast-dropdown > div > div {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAMAAAB1GNVPAAAAElBMVEU+Pj4/Pz9AQEAVFRUWFhb///+2UyocAAAAA3RSTlMAAAD6dsTeAAAAHUlEQVR42mNggQAGJjDFxMDIyMzMzMjIAATMQAwABbgARWfCNlIAAAAASUVORK5CYII=");
width: 7px;
height: 4px; }
#formspec_ast-properties {
position: fixed;

View File

@ -33,9 +33,10 @@
background: url("grid.png");
}
&, input, textarea {
&, input, textarea, select {
font-family: Arimo, sans-serif;
color: #FFFFFF;
font-size: inherit;
}
& > * {
@ -80,7 +81,8 @@ img {
.formspec_ast-button, .formspec_ast-button_exit,
.formspec_ast-image_button[data-drawborder="true"],
.formspec_ast-image_button_exit[data-drawborder="true"] {
.formspec_ast-image_button_exit[data-drawborder="true"],
.formspec_ast-dropdown > div {
box-sizing: border-box;
border: 1px solid #000;
background: #414141;
@ -213,6 +215,53 @@ img {
}
}
.formspec_ast-dropdown {
border: 2px solid #1E1E1E;
box-sizing: border-box;
select {
border: none;
border-radius: 0;
background: #1E1E1E;
width: 100%;
height: 100%;
-moz-appearance: none;
-webkit-appearance: none;
appearance: none;
// Remove the outline
outline: none;
&:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 #fff;
}
&:focus {
background: #467832;
}
}
&.formspec_ast-clickable select {
pointer-events: none;
}
& > div {
position: absolute;
top: 0;
right: 0;
width: 15px;
height: 100%;
pointer-events: none;
// The arrow icon
& > div {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAMAAAB1GNVPAAAAElBMVEU+Pj4/Pz9AQEAVFRUWFhb///+2UyocAAAAA3RSTlMAAAD6dsTeAAAAHUlEQVR42mNggQAGJjDFxMDIyMzMzMjIAATMQAwABbgARWfCNlIAAAAASUVORK5CYII=");
width: 7px;
height: 4px;
}
}
}
}
#formspec_ast-properties {