list
Web3D/VR
#@extern @vr-extern-proto-object-box.wrl
PROTO ClickableList [
eventIn SFString addItem
eventIn SFString removeItem
exposedField MFString items []
eventOut SFString itemSelected
eventOut SFInt32 itemIdSelected
field SFVec2f position 0 0
field SFVec2f size 1 1
field SFFloat fontSize 0.05
exposedField SFFloat transparency 0
] {
DEF TRANSFORM Transform {
children [
DEF TOUCHSENSOR TouchSensor {
enabled TRUE
}
DEF TEXTTRANSFORM Transform {
children [
Shape {
appearance Appearance {
material Material {
emissiveColor 0 0 0
diffuseColor 0 0 0
}
}
geometry DEF TEXT Text {
fontStyle FontStyle {
family "TYPEWRITER"
style "BOLD"
size IS fontSize
}
}
}
]
}
DEF BOXTRANSFORM Transform {
children [
Shape {
appearance Appearance {
material Material {
transparency IS transparency
emissiveColor 1 1 1
diffuseColor 0 0 0
}
}
geometry DEF BOX box {}
}
]
}
]
}
DEF SCRIPT Script {
eventIn SFTime touchTime
eventIn SFVec3f hitPoint_changed
field SFVec3f hitPoint 0 0 0
field SFNode transformNode USE TRANSFORM
eventOut SFVec3f boxNodeSize
field SFNode boxTransform USE BOXTRANSFORM
field SFNode textNode USE TEXT
field SFNode textTransform USE TEXTTRANSFORM
field SFVec2f position IS position
field SFVec2f size IS size
field SFFloat fontSize IS fontSize
field SFInt32 maxLength 0
field SFInt32 maxLines 0
eventIn SFString addItem IS addItem
eventIn SFString removeItem IS removeItem
eventIn MFString set_items IS items
field MFString items IS items
eventOut MFString items_changed IS items
eventOut SFString itemSelected IS itemSelected
eventOut SFInt32 itemIdSelected IS itemIdSelected
url "vrmlscript:
function initialize() {
transformNode.translation
= new SFVec3f(position.x,position.y,0);
boxNodeSize = new SFVec3f(size.x,size.y,0.01);
boxTransform.translation
= new SFVec3f(size.x/2,-size.y/2,0);
textTransform.translation
= new SFVec3f(0,-fontSize,0.015);
// The maxLength is an approximation based upon experimentation in
// getting the right size...
maxLength = (size.x/fontSize)*1.9;
maxLines = (size.y/fontSize);
line = '';
}
function hitPoint_changed(value,time) {
hitPoint = value;
}
function touchTime(value,time) {
y = (-hitPoint.y)/fontSize;
//Browser.print('Touched at location : ' + hitPoint +
// ' is line ' + y);
nrLines = items.length;
if(y>=0 && y<nrLines) {
//Browser.print('Selected : ' + temp[y]);
itemSelected = items[y];
itemIdSelected = y;
}
}
function addItem(value,time) {
items[items.length] = value;
items_changed = items;
}
function removeItem(value,time) {
length = items.length;
for(i=0;i<length;i++) {
if(items[i] == value) {
items[i] = items[length-1];
items.length = length - 1;
items_changed = items;
return;
}
}
}
function set_items(value,time) {
items = value;
items_changed = items;
}
"
}
ROUTE SCRIPT.items_changed TO TEXT.string
ROUTE TOUCHSENSOR.touchTime TO SCRIPT.touchTime
ROUTE TOUCHSENSOR.hitPoint_changed TO SCRIPT.hitPoint_changed
ROUTE SCRIPT.boxNodeSize TO BOX.size
}