if(build LT '2020-11-01',
error('combobox.xml - too old krpano version!');
set(events[combobox_xml_plugin_events].name, null);
set(action[addComboboxLayer].content, '');
set(action[removeComboboxLayer].content, '');
,
combobox_xml_init();
);
set(action[combobox_xml_init].autorun, onload);
combobox_parse_xml_elements();
if(global.combobox,
copy(combobox_src, global.combobox);
delete(global.combobox);
def(i, integer, 0);
def(cnt, integer, get(combobox_src.count));
if(cnt GT 0, loop(i LT cnt,
copy(cb, combobox_src[get(i)]);
if(cb AND cb.name AND cb.parsed != true,
set(cb.parsed, true);
addComboboxLayer(get(cb.name), get(cb.design));
copy(ly, global.layer[get(cb.name)]);
copyattributes(get(ly), get(cb));
set(ly.keep, true);
def(item_cnt, integer, get(cb.item.count));
if(item_cnt GT 0,
def(item_i, integer, 0);
loop(item_i LT item_cnt,
combobox_additem(get(ly.name), get(cb.item[get(item_i)].name), get(cb.item[get(item_i)].caption), get(cb.item[get(item_i)].onclick), get(cb.item[get(item_i)].oninit));
inc(item_i);
);
);
);
inc(i);
));
);
addlayer(get(cbname));
copy(cb, global.layer[get(cbname)]);
set(cb.keep, true);
if(!global.combobox_design[get(design)].name, set(design,'default'));
copy(cb.cbdesign, global.combobox_design[get(design)]);
calc(cb.margin, cb.cbdesign.margin !== null ? cb.cbdesign.margin : 2);
calc(cb.open_close_speed, cb.cbdesign.open_close_speed !== null ? cb.cbdesign.open_close_speed : 0.25);
cb.loadstyle(combobox_container_style);
copyattributes(get(cb), get(cb.cbdesign.style[combobox_container_style]));
calc(cb.addItem, 'combobox_additem(' + cbname + ', null, "%%1", "%%2");');
calc(cb.addNamedItem, 'combobox_additem(' + cbname + ', "%%1", "%%2", "%%3");');
calc(cb.addIdItem, 'combobox_additem(' + cbname + ', "%%1", "%%2", "%%3");');
calc(cb.selectItem, 'combobox_finditem(' + cbname + ', "%%1", __cb_fi); if(__cb_fi GE 0, combobox_selectitem(' + cbname + ', get(__cb_fi))); delete(__cb_fi);');
calc(cb.selectItemByName, 'combobox_selectitem(' + cbname + ', "%%1");');
calc(cb.selectIdItem, 'combobox_selectitem(' + cbname + ', "%%1");');
calc(cb.removeAll, 'combobox_removeitems(' + cbname + ');');
calc(cb.openList, 'combobox_openlist(' + cbname + ');');
calc(cb.closeList, 'combobox_closelist(' + cbname + ');');
calc(saname, 'combobox_' + cbname + '_scrollarea');
addlayer(get(saname));
copy(sa, global.layer[get(saname)]);
copy(sa.parent, cbname);
copy(sa.url, global.combobox_scrollareaplugin.url);
copy(sa.keep, true);
copy(sa.align, lefttop);
set(sa.direction, v);
set(sa.enabled, false);
set(sa.width, 100%);
set(sa.height, 100%);
copy(cb.scrollarea, sa);
calc(mkname, 'combobox_' + cbname + '_marker');
addlayer(get(mkname));
copy(mk, global.layer[get(mkname)]);
copy(mk.parent, saname);
copy(mk.keep, true);
mk.loadstyle(combobox_marker_style);
copyattributes(get(mk), get(cb.cbdesign.style[combobox_marker_style]));
copy(cb.marker, mk);
cb.createarray('item');
set(cb.autosize_i, 0);
set(cb.autosize_cnt, 0);
set(cb.autosize_max_w, 0);
set(cb.autosize_max_h, 0);
set(cb.lastselecteditemindex, 0);
set(cb.selecteditemindex, 0);
if(global.layer[get(cbname)],
copy(cb, global.layer[get(cbname)]);
if(cb === global.openedcombobox, delete(global.openedcombobox));
if(cb,
removelayer(get(cbname), true);
);
);
combobox_openlist(get(name));
copy(cb, global.layer[get(cbname)]);
if(itemname === null, calc(itemname, 'autoname_' + cb.item.count); );
copy(cb.item[get(itemname)].caption, itemcaption);
copy(cb.item[get(itemname)].onclick, itemonclick);
inc(cb.autosize_cnt);
calc(itemlayername, 'comboboxitem_' + cbname + '_' + itemname);
addlayer(get(itemlayername));
copy(li, global.layer[get(itemlayername)]);
li.loadstyle(combobox_item_style);
copyattributes(get(li), get(cb.cbdesign.style[combobox_item_style]));
copy(li.parent, cb.scrollarea.name);
copy(li.keep, true);
copy(li.cblayername, cb.name);
copy(li.itemname, itemname);
copy(li.html, itemcaption);
set(li.onautosized, delayedcall(0,combobox_item_autosize_update()) );
set(li.onclick, combobox_item_onclick() );
if (isset(itemoninit), callwith(li, itemoninit));
copy(cb.item[get(itemname)].itemlayername, itemlayername);
copy(cb.item[get(itemname)].itemlayer, li);
copy(cb, global.layer[get(caller.cblayername)]);
inc(cb.autosize_i);
Math.max(cb.autosize_max_w, caller.width);
Math.max(cb.autosize_max_h, caller.height);
if(cb.autosize_i == cb.autosize_cnt, combobox_align_items(get(cb.name)); );
copy(cb, global.layer[get(cbname)]);
if(cb.marker.havemarkersize == false OR cb.scrollarea.loaded == false,
delayedcall(calc(cb.name + '_waitformarkersize'), 0.01, combobox_align_items(get(cbname)) );
,
if(global.openedcombobox === cb, combobox_closelist() );
copy(sa, cb.scrollarea);
calc(itemwidth, cb.margin GT 0 ? -2 * cb.margin : '100%');
copy(mk_w, cb.marker.width);
copy(item_cnt, cb.autosize_cnt);
for(def(item_i, integer, 0), item_i LT item_cnt, inc(item_i),
copy(li, global.layer[get(cb.item[get(item_i)].itemlayername)]);
set(li.x, get(cb.margin));
copy(li.width, itemwidth);
copy(li.height, cb.autosize_max_h);
calc(li.y, cb.margin + item_i * (cb.autosize_max_h + cb.margin));
);
if(cb.width == null OR cb.width == cb.lastautosizedwidth,
calc(cb.width, cb.margin + cb.autosize_max_w + 2 + mk_w + cb.margin);
copy(cb.lastautosizedwidth, cb.width);
);
calc(cb.height, 2*cb.margin + cb.autosize_max_h);
calc(sa.height, cb.margin + item_cnt*(cb.margin+cb.autosize_max_h));
calc(sa.y, -(cb.selecteditemindex * (cb.autosize_max_h + cb.margin)));
calc(cb.marker.x, cb.margin + mk_w/2);
tween(global.layer[get(cb.name)].marker.y, calc(cb.margin + cb.selecteditemindex*(cb.autosize_max_h + cb.margin) + cb.autosize_max_h/2), 0.1);
delayedcall(0.1, set(global.layer[get(cb.name)].visible,true); );
);
if(eventcode !== null, callwith(cb, get(eventcode) ); );
copy(cb, global.layer[get(caller.cblayername)]);
copy(itemname, caller.itemname);
combobox_selectitem(get(cb.name), get(itemname));
if(global.openedcombobox === cb, combobox_closelist() );
if(cb.item[get(itemname)].onclick,
if(cb.callonclickafterclose === false,
combobox_do_event_call(get(cb), get(cb.item[get(itemname)].onclick));
,
delayedcall(get(cb.open_close_speed),
copy(cb.curitem, cb.item[get(itemname)]);
combobox_do_event_call(get(cb), get(cb.item[get(itemname)].onclick));
);
);
);
if(global.combbox_item_pressed != true,
copy(cb, global.layer[get(cbname)]);
copy(cb.lastselecteditemindex, cb.selecteditemindex);
copy(cb.selecteditemindex, cb.item[get(itemname)].index);
if(cb.lastselecteditemindex != cb.selecteditemindex AND cb.onchange,
combobox_do_event_call(get(cb), get(cb.onchange));
);
if(global.openedcombobox === cb,
combobox_closelist();
,
if(global.layer[get(cbname)].scrollarea.loaded,
global.layer[get(cbname)].scrollarea.stopscrolling();
calc(offset, cb.selecteditemindex*(cb.autosize_max_h + cb.margin));
tween(global.layer[get(cbname)].marker.y, calc(cb.margin + offset + cb.autosize_max_h/2), 0);
tween(global.layer[get(cbname)].scrollarea.y, calc(-offset), 0, default, global.layer[get(cbname)].scrollarea.update(); );
);
);
);
copy(cb, global.layer[get(cbname)]);
copy(item_cnt, cb.item.count);
set(calc('global.' + returnvariable), -1);
for(def(item_i, integer, 0), item_i LT item_cnt, inc(item_i),
if(cb.item[get(item_i)].caption == itemcaption,
copy(calc('global.' + returnvariable), item_i);
copy(item_i, item_cnt);
);
);
copy(cb, global.layer[get(cbname)]);
if(global.openedcombobox === cb, combobox_closelist() );
calc(item_i, cb.item.count - 1);
loop(item_i GE 0,
removelayer(get(cb.item[get(item_i)].itemlayername));
dec(item_i);
);
set(cb.item.count, 0);
set(cb.autosize_i,0);
set(cb.autosize_cnt, 0);
set(cb.autosize_max_w, 0);
set(cb.autosize_max_h, 0);
set(cb.selecteditemindex, 0);
set(cb.lastselecteditemindex, 0);
if(cb.width == cb.lastautosizedwidth, set(cb.width, null));
if(global.openedcombobox !== null, combobox_closelist() );
copy(cb, global.layer[get(cbname)]);
copy(global.openedcombobox, cb);
copy(cb.backupzorder, cb.zorder);
set(cb.zorder, 999);
calc(cbheight, 2*cb.margin + cb.autosize_max_h);
set(lx1, 0);
set(ly1, 0);
copy(lx2, cb.pixelwidth);
copy(ly2, cbheight);
layertoscreen(get(cbname), lx1,ly1, lx1,ly1);
layertoscreen(get(cbname), lx2,ly2, lx2,ly2);
calc(space_above, ly1 - global.area.pixely);
calc(space_below, global.area.pixelheight - (ly2 - global.area.pixely));
calc(openheight, cb.margin + cb.autosize_cnt*(cb.margin+cb.autosize_max_h) );
calc(cb_edge, cb.edge ? cb.edge : cb.align);
calc(iscentered, cb_edge == 'left' OR cb_edge == 'center' OR cb_edge == 'right');
if(iscentered,
calc(openheight_max, space_above + space_below);
,
Math.max(openheight_max, space_above, space_below);
);
Math.min(openheight, calc(openheight_max + cbheight - 20));
set(yoffset, null);
calc(top_overflow, -ly1 + global.area.pixely + openheight/2);
calc(bottom_overflow, ly2 - global.area.pixely + openheight/2 - global.area.pixelheight);
if(cb.parent,
Math.max(max_overflow, top_overflow, bottom_overflow, 0);
sub(openheight, max_overflow);
,
if(iscentered,
if(openheight GE (global.area.pixelheight - 20),
set(yoffset,0);
,
if(top_overflow GT 0, calc(yoffset, cb.y + top_overflow); );
if(bottom_overflow GT 0, calc(yoffset, cb.y - bottom_overflow); );
);
,
indexoftxt(isbottomalign, get(cb_edge), 'bottom');
if(space_above GT space_below,
if(isbottomalign LT 0, calc(yoffset, cb.y - openheight + cbheight); );
,
if(isbottomalign GE 0, calc(yoffset, cb.y - openheight + cbheight); );
);
);
);
if(yoffset != null,
copy(cb.ybackup, cb.y);
tween(global.layer[get(cbname)].y, calc(yoffset), get(cb.open_close_speed));
);
calc(centeritem_y, -1 * (cb.margin + cb.selecteditemindex*(cb.margin+cb.autosize_max_h) + cb.autosize_max_h/2 - openheight/2));
clamp(centeritem_y, calc(openheight - cb.scrollarea.height), 0);
tween(global.layer[get(cbname)].height, get(openheight), get(cb.open_close_speed));
tween(global.layer[get(cbname)].scrollarea.y, get(centeritem_y), get(cb.open_close_speed), default, global.layer[get(cbname)].scrollarea.update(); );
if(global.device.html5,
tween(global.layer[get(cbname)].marker.rotate, 90, get(cb.open_close_speed));
,
set(global.layer[get(cbname)].marker.html, '◀');
);
set(cb.scrollarea.enabled, true);
set(global.events[combobox_xml_plugin_events].onmousedown, combobox_closelist() );
if(global.openedcombobox !== null,
copy(cb, global.openedcombobox);
delete(global.openedcombobox);
copy(cb.zorder, cb.backupzorder);
set(global.events[combobox_xml_plugin_events].onmousedown, null);
set(cb.scrollarea.enabled, false);
calc(offset, cb.selecteditemindex*(cb.autosize_max_h + cb.margin));
if(cb.ybackup !== null, tween(cb.y, get(cb.ybackup), get(cb.open_close_speed)));
global.layer[get(cb.name)].scrollarea.stopscrolling();
tween(global.layer[get(cb.name)].height, calc(2*cb.margin + cb.autosize_max_h), get(cb.open_close_speed));
tween(global.layer[get(cb.name)].scrollarea.y, calc(-offset), get(cb.open_close_speed), default, global.layer[get(cb.name)].scrollarea.update(); );
tween(global.layer[get(cb.name)].marker.y, calc(cb.margin + offset + cb.autosize_max_h/2), get(cb.open_close_speed));
if(global.device.html5,
tween(global.layer[get(cb.name)].marker.rotate, 0, get(cb.open_close_speed));
,
set(global.layer[get(cb.name)].marker.html, '▼');
);
);