rename platform internals, organize ui bindings (a little)

This commit is contained in:
Stewart Allen 2025-12-25 11:05:31 -05:00
commit 42a933e2de
2 changed files with 92 additions and 92 deletions

View file

@ -79,9 +79,6 @@ export async function init_sync() {
api.event.alerts(true); api.event.alerts(true);
}; };
// enable modal hiding
$('mod-x').onclick = api.modal.hide;
if (!SETUP.s) console.log(`kiri | init main | ${version}`); if (!SETUP.s) console.log(`kiri | init main | ${version}`);
// send init-done event // send init-done event
@ -108,21 +105,9 @@ export async function init_sync() {
},false); },false);
}); });
// dismiss gdpr alert
$('gotit').onclick = () => {
$('gdpr').style.display = 'none';
sdb.gdpr = Date.now();
};
// Setup navigation button bindings // Setup navigation button bindings
setup_keybd_nav(ui, WIN, LANG); setup_keybd_nav(ui, WIN, LANG);
// ui.modal.onclick = api.modal.hide;
ui.modalBox.onclick = (ev) => { ev.stopPropagation() };
// add app name hover info
$('app-info').innerText = version;
// show topline separator when iframed // show topline separator when iframed
try { if (WIN.self !== WIN.top) $('top-sep').style.display = 'flex' } catch (e) { console.log(e) } try { if (WIN.self !== WIN.top) $('top-sep').style.display = 'flex' } catch (e) { console.log(e) }
@ -289,4 +274,19 @@ function setup_keybd_nav(ui, WIN, LANG) {
$('context-contents').onclick = () => { api.SPACE.view.fit() }; $('context-contents').onclick = () => { api.SPACE.view.fit() };
$('view-fit').onclick = () => { api.SPACE.view.fit() }; $('view-fit').onclick = () => { api.SPACE.view.fit() };
$('wassup').onmouseover = () => { $('suppopp').classList.remove('hide') }; $('wassup').onmouseover = () => { $('suppopp').classList.remove('hide') };
// prevent modal input from propagating to parents
ui.modalBox.onclick = (ev) => { ev.stopPropagation() };
// enable modal hiding
$('mod-x').onclick = api.modal.hide;
// dismiss gdpr alert
$('gotit').onclick = () => {
$('gdpr').style.display = 'none';
sdb.gdpr = Date.now();
};
// add app name hover info
$('app-info').innerText = version;
} }

View file

@ -1,16 +1,15 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */ /** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
import { $, h } from '../../moto/webui.js'; import { $, h } from '../../moto/webui.js';
import { api } from './api.js';
import { ajax, js2o } from '../core/utils.js'; import { ajax, js2o } from '../core/utils.js';
import { api } from './api.js';
import { base } from '../../geo/base.js'; import { base } from '../../geo/base.js';
import { load } from '../../load/file.js';
import { space } from '../../moto/space.js';
import { Widget, newWidget } from '../core/widget.js';
import { Packer } from './pack.js';
import { COLOR, MODES } from '../core/consts.js'; import { COLOR, MODES } from '../core/consts.js';
import { load as file_load } from '../../load/file.js';
import { Packer } from './pack.js';
import { space } from '../../moto/space.js';
import { THREE } from '../../ext/three.js'; import { THREE } from '../../ext/three.js';
import { Widget, newWidget } from '../core/widget.js';
const V0 = new THREE.Vector3(0,0,0); const V0 = new THREE.Vector3(0,0,0);
@ -26,7 +25,7 @@ function get_mode() {
return api.mode.get_id(); return api.mode.get_id();
} }
function platformUpdateOrigin(update_bounds = true) { function update_origin(update_bounds = true) {
if (update_bounds) { if (update_bounds) {
platform.update_bounds(); platform.update_bounds();
} }
@ -106,7 +105,7 @@ function platformUpdateOrigin(update_bounds = true) {
} }
} }
function platformUpdateSize(updateDark = true) { function update_size(updateDark = true) {
const { process, device, controller } = current(); const { process, device, controller } = current();
const { showRulers, units } = controller; const { showRulers, units } = controller;
@ -154,7 +153,7 @@ function platformUpdateMidZ() {
space.platform.setMaxZ(topZ); space.platform.setMaxZ(topZ);
} }
function platformUpdateTopZ() { function update_top_z() {
const { process, stock } = current(); const { process, stock } = current();
const MODE = get_mode(); const MODE = get_mode();
api.widgets.each(widget => { api.widgets.each(widget => {
@ -209,12 +208,12 @@ function platformUpdateStock() {
} }
} }
function platformSetBounds(bounds) { function set_bounds(bounds) {
setbounds = bounds; setbounds = bounds;
return platformUpdateBounds(); return update_bounds();
} }
function platformUpdateBounds() { function update_bounds() {
const bounds = setbounds || new THREE.Box3(); const bounds = setbounds || new THREE.Box3();
if (!setbounds) if (!setbounds)
api.widgets.each(widget => { api.widgets.each(widget => {
@ -231,17 +230,17 @@ function platformUpdateBounds() {
} }
current().bounds = bounds; current().bounds = bounds;
platformUpdateStock(); platformUpdateStock();
platformUpdateTopZ(); update_top_z();
platformUpdateMidZ(); platformUpdateMidZ();
platformUpdateOrigin(false); update_origin(false);
return bounds; return bounds;
} }
function platformSelectedCount() { function selected_count() {
return api.view.is_arrange() ? api.selection.count() : 0; return api.view.is_arrange() ? api.selection.count() : 0;
} }
function platformUpdateSelected() { function update_selected() {
const settings = current(); const settings = current();
const { device } = settings; const { device } = settings;
@ -267,7 +266,7 @@ function platformUpdateSelected() {
} }
} }
function platformSelect(widget, shift, recurse = true) { function select(widget, shift, recurse = true) {
const { event, selection, view } = api; const { event, selection, view } = api;
if (!view.is_arrange()) { if (!view.is_arrange()) {
@ -277,7 +276,7 @@ function platformSelect(widget, shift, recurse = true) {
// apply select to entire group // apply select to entire group
if (recurse && widget && widget.group.length > 1) { if (recurse && widget && widget.group.length > 1) {
for (let w of widget.group) { for (let w of widget.group) {
platformSelect(w, true, false); select(w, true, false);
} }
return; return;
} }
@ -308,7 +307,7 @@ function platformSelect(widget, shift, recurse = true) {
space.update(); space.update();
} }
function platformDeselect(widget, recurse = true) { function deselect(widget, recurse = true) {
const { selection, view } = api; const { selection, view } = api;
if (!view.is_arrange()) { if (!view.is_arrange()) {
@ -320,7 +319,7 @@ function platformDeselect(widget, recurse = true) {
// apply deselect to entire group // apply deselect to entire group
if (recurse && widget && widget.group.length > 1) { if (recurse && widget && widget.group.length > 1) {
for (let w of widget.group) { for (let w of widget.group) {
platformDeselect(w, false); deselect(w, false);
} }
return; return;
} }
@ -343,7 +342,7 @@ function platformDeselect(widget, recurse = true) {
space.update(); space.update();
} }
function platformLoad(url, onload) { function load(url, onload) {
if (url.toLowerCase().indexOf(".stl") > 0) { if (url.toLowerCase().indexOf(".stl") > 0) {
platform.load_stl(url, onload); platform.load_stl(url, onload);
} else { } else {
@ -357,8 +356,8 @@ function platformLoad(url, onload) {
} }
} }
function platformLoadSTL(url, onload, formdata, credentials, headers) { function load_stl(url, onload, formdata, credentials, headers) {
new load.STL().load(url, (vertices, filename) => { new file_load.STL().load(url, (vertices, filename) => {
if (vertices) { if (vertices) {
let widget = newWidget().loadVertices(vertices); let widget = newWidget().loadVertices(vertices);
widget.meta.file = filename; widget.meta.file = filename;
@ -370,9 +369,9 @@ function platformLoadSTL(url, onload, formdata, credentials, headers) {
}, formdata, 1 / api.view.unit_scale(), credentials, headers); }, formdata, 1 / api.view.unit_scale(), credentials, headers);
} }
function platformLoadURL(url, options = {}) { function load_url(url, options = {}) {
platform.group(); platform.group();
load.URL.load(url, options).then(objects => { file_load.URL.load(url, options).then(objects => {
let widgets = []; let widgets = [];
for (let object of objects) { for (let object of objects) {
let widget = newWidget(undefined, options.group).loadVertices(object.mesh); let widget = newWidget(undefined, options.group).loadVertices(object.mesh);
@ -391,12 +390,12 @@ function platformLoadURL(url, options = {}) {
}); });
} }
function platformGroup() { function group() {
grouping = true; grouping = true;
} }
// called after all new widgets are loaded to update group positions // called after all new widgets are loaded to update group positions
function platformGroupDone(skipLayout) { function group_done(skipLayout) {
grouping = false; grouping = false;
Widget.Groups.loadDone(); Widget.Groups.loadDone();
if (api.feature.drop_layout && !skipLayout) { if (api.feature.drop_layout && !skipLayout) {
@ -407,7 +406,7 @@ function platformGroupDone(skipLayout) {
let deferred = []; let deferred = [];
let deferTimeout; let deferTimeout;
function platformAdd(widget, shift, nolayout, defer) { function add(widget, shift, nolayout, defer) {
api.widgets.add(widget); api.widgets.add(widget);
space.world.add(widget.mesh); space.world.add(widget.mesh);
widget.anno = widget.anno || {}; widget.anno = widget.anno || {};
@ -420,13 +419,13 @@ function platformAdd(widget, shift, nolayout, defer) {
platform.select(widget, shift); platform.select(widget, shift);
platform.update_bounds(); platform.update_bounds();
api.space.auto_save(); api.space.auto_save();
platformChanged(); changed();
api.event.emit('widget.add', widget); api.event.emit('widget.add', widget);
if (nolayout) { if (nolayout) {
return; return;
} }
if (!grouping) { if (!grouping) {
platformGroupDone(nolayout); group_done(nolayout);
if (!current().controller.autoLayout) { if (!current().controller.autoLayout) {
positionNewWidget(widget); positionNewWidget(widget);
} }
@ -445,12 +444,12 @@ function platformAddDeferred() {
} }
} }
if (!grouping) { if (!grouping) {
platformGroupDone(skiplayout); group_done(skiplayout);
} }
api.event.emit('widget.add', deferred.map(r => r.widget)); api.event.emit('widget.add', deferred.map(r => r.widget));
platform.update_bounds(); platform.update_bounds();
api.space.auto_save(); api.space.auto_save();
platformChanged(); changed();
deferred = []; deferred = [];
} }
@ -511,7 +510,7 @@ function platformDelete(widget, defer) {
for (let i = 0; i < mc.length; i++) { for (let i = 0; i < mc.length; i++) {
platform.delete(mc[i].widget || mc[i], true); platform.delete(mc[i].widget || mc[i], true);
} }
platformDeletePost(); delete_post();
api.event.emit('widget.delete', widget); api.event.emit('widget.delete', widget);
return; return;
} }
@ -521,12 +520,12 @@ function platformDelete(widget, defer) {
Widget.Groups.remove(widget); Widget.Groups.remove(widget);
space.world.remove(widget.mesh); space.world.remove(widget.mesh);
if (!defer) { if (!defer) {
platformDeletePost(); delete_post();
api.event.emit('widget.delete', widget); api.event.emit('widget.delete', widget);
} }
} }
function platformDeletePost() { function delete_post() {
api.view.update_slider_max(); api.view.update_slider_max();
platform.update_bounds(); platform.update_bounds();
if (get_mode() !== MODES.FDM) { if (get_mode() !== MODES.FDM) {
@ -538,11 +537,11 @@ function platformDeletePost() {
platform.layout(); platform.layout();
} }
api.space.auto_save(); api.space.auto_save();
platformChanged(); changed();
} }
// render list of current widgets // render list of current widgets
function platformChanged() { function changed() {
h.bind($('ws-widgets'), api.widgets.all().map(w => { h.bind($('ws-widgets'), api.widgets.all().map(w => {
let color; let color;
let file = w.meta.file || 'no name'; let file = w.meta.file || 'no name';
@ -619,7 +618,7 @@ function platformChanged() {
// w.setColor(color, null, false); // w.setColor(color, null, false);
// }, // },
onclick() { onclick() {
platformSelect(w, true, false); select(w, true, false);
color = w.getColor(); color = w.getColor();
} }
}) })
@ -628,13 +627,13 @@ function platformChanged() {
})); }));
} }
function platformSelectAll() { function select_all() {
api.widgets.each(widget => { api.widgets.each(widget => {
platform.select(widget, true, false) platform.select(widget, true, false)
}); });
} }
function platformLayout() { function layout() {
const MODE = get_mode(); const MODE = get_mode();
const settings = current(); const settings = current();
const { process, device, controller } = settings; const { process, device, controller } = settings;
@ -659,7 +658,7 @@ function platformLayout() {
gap = gap || ((process.sliceSupportExtra || 0) * 2) + 1; gap = gap || ((process.sliceSupportExtra || 0) * 2) + 1;
// auto resize device to support a larger object // auto resize device to support a larger object
if (isBelt) { if (isBelt) {
fitDeviceToWidgets(); fit();
} }
break; break;
} }
@ -686,7 +685,7 @@ function platformLayout() {
if (isBelt) { if (isBelt) {
gap += process.firstLayerBeltLead || 0; gap += process.firstLayerBeltLead || 0;
const WIDGETS = api.widgets.all(); const WIDGETS = api.widgets.all();
let bounds = platformUpdateBounds(), let bounds = update_bounds(),
movey = -(device.bedDepth / 2); movey = -(device.bedDepth / 2);
for (let widget of WIDGETS) { for (let widget of WIDGETS) {
let ylen = widget.track.box.h; let ylen = widget.track.box.h;
@ -737,15 +736,15 @@ function platformLayout() {
api.event.emit('platform.layout'); api.event.emit('platform.layout');
} }
function platformLoadWidget(group, vertices, filename) { function load_verts(group, vertices, filename) {
const widget = newWidget(undefined, group).loadVertices(vertices.toFloat32(), true); const widget = newWidget(undefined, group).loadVertices(vertices.toFloat32(), true);
widget.meta.file = filename; widget.meta.file = filename;
if (filename) widget.saveToCatalog(filename); if (filename) widget.saveToCatalog(filename);
platformAdd(widget); add(widget);
return widget; return widget;
} }
function platformLoadFiles(files, group) { function load_files(files, group) {
platform.group(); platform.group();
let loading = files.length; let loading = files.length;
for (let file of files) { for (let file of files) {
@ -773,7 +772,7 @@ function platformLoadFiles(files, group) {
} }
} }
if (israw) { if (israw) {
platformLoadWidget(group, JSON.parse(data)); load_verts(group, JSON.parse(data));
load_dec(); load_dec();
} else if (api.feature.on_load && (isstl || isobj || is3mf)) { } else if (api.feature.on_load && (isstl || isobj || is3mf)) {
api.feature.on_load(data, file); api.feature.on_load(data, file);
@ -782,14 +781,14 @@ function platformLoadFiles(files, group) {
api.feature.on_add_stl(data, file); api.feature.on_add_stl(data, file);
load_dec(); load_dec();
} else if (isstl) { } else if (isstl) {
const stl = new load.STL().parse(data, api.view.unit_scale()); const stl = new file_load.STL().parse(data, api.view.unit_scale());
platformLoadWidget(group, stl, name); load_verts(group, stl, name);
load_dec(); load_dec();
} else if (isobj) { } else if (isobj) {
const objs = load.OBJ.parse(data.textDecode('utf-8')); const objs = file_load.OBJ.parse(data.textDecode('utf-8'));
const ondn = function() { const ondn = function() {
for (let obj of objs) { for (let obj of objs) {
platformLoadWidget(group, obj, obj.name ? `${obj.name}-${name}` : name); load_verts(group, obj, obj.name ? `${obj.name}-${name}` : name);
} }
load_dec(); load_dec();
}; };
@ -810,7 +809,7 @@ function platformLoadFiles(files, group) {
api.show.progress(progress, "converting"); api.show.progress(progress, "converting");
}, vertices => { }, vertices => {
api.show.progress(0); api.show.progress(0);
let wid = platformLoadWidget(group, vertices, name); let wid = load_verts(group, vertices, name);
if (api.mode.is_cam()) { if (api.mode.is_cam()) {
// attach raw illustration // attach raw illustration
// api.event.emit('cam.parse.gerber', { data: text, mesh: wid.mesh }); // api.event.emit('cam.parse.gerber', { data: text, mesh: wid.mesh });
@ -821,13 +820,13 @@ function platformLoadFiles(files, group) {
let odon = function(models) { let odon = function(models) {
let msg = api.show.alert('Adding Objects'); let msg = api.show.alert('Adding Objects');
for (let model of models) { for (let model of models) {
platformLoadWidget(group, model.faces, model.name ? `${model.name}-${name}` : name); load_verts(group, model.faces, model.name ? `${model.name}-${name}` : name);
} }
load_dec(); load_dec();
api.hide.alert(msg); api.hide.alert(msg);
} }
let msg = api.show.alert('Decoding 3MF'); let msg = api.show.alert('Decoding 3MF');
load.TMF.parseAsync(data).then(models => { file_load.TMF.parseAsync(data).then(models => {
api.hide.alert(msg); api.hide.alert(msg);
if (models.length > 1 && !group) { if (models.length > 1 && !group) {
api.uc.confirm(`group ${models.length} objects?`).then(ok => { api.uc.confirm(`group ${models.length} objects?`).then(ok => {
@ -846,14 +845,14 @@ function platformLoadFiles(files, group) {
} else if (issvg) { } else if (issvg) {
loadSVGDialog(opt => { loadSVGDialog(opt => {
group = group || []; group = group || [];
let svg = load.SVG.parse(data.textDecode('utf-8'), opt); let svg = file_load.SVG.parse(data.textDecode('utf-8'), opt);
let ind = 0; let ind = 0;
if (svg.length === 0) { if (svg.length === 0) {
api.show.alert(`SVG contains no polylines`, 10); api.show.alert(`SVG contains no polylines`, 10);
api.show.alert(`Fonts must be converted to paths`, 10); api.show.alert(`Fonts must be converted to paths`, 10);
} }
for (let v of svg) { for (let v of svg) {
platformLoadWidget(group, svg[ind++], ind ? `${name}-${ind}` : name); load_verts(group, svg[ind++], ind ? `${name}-${ind}` : name);
} }
load_dec(); load_dec();
}); });
@ -896,7 +895,8 @@ function loadSVGDialog(doit) {
}); });
} }
function fitDeviceToWidgets() { // resize platform (expand) to fit widgets (belt mode)
function fit() {
let maxy = 0; let maxy = 0;
api.widgets.each(widget => { api.widgets.each(widget => {
let wb = widget.mesh.getBoundingBox().clone(); let wb = widget.mesh.getBoundingBox().clone();
@ -919,28 +919,28 @@ function fitDeviceToWidgets() {
// extend API (api.platform) // extend API (api.platform)
export const platform = { export const platform = {
fit: fitDeviceToWidgets, fit,
add: platformAdd, add,
changed: platformChanged, changed,
delete: platformDelete, delete: platformDelete,
layout: platformLayout, layout: layout,
group: platformGroup, group,
group_done: platformGroupDone, group_done,
load: platformLoad, load,
load_stl: platformLoadSTL, load_stl,
load_url: platformLoadURL, load_url,
load_files: platformLoadFiles, load_files,
load_verts: platformLoadWidget, load_verts,
deselect: platformDeselect, deselect,
select: platformSelect, select,
select_all: platformSelectAll, select_all,
selected_count: platformSelectedCount, selected_count,
set_bounds: platformSetBounds, set_bounds,
update_origin: platformUpdateOrigin, update_origin,
update_bounds: platformUpdateBounds, update_bounds,
update_size: platformUpdateSize, update_size,
update_top_z: platformUpdateTopZ, update_top_z,
update_selected: platformUpdateSelected, update_selected,
update: space.platform.update, update: space.platform.update,
set_font: space.platform.setFont, set_font: space.platform.setFont,
show_axes: space.platform.showAxes, show_axes: space.platform.showAxes,