From 6f9e066d13d456cb25c26c1ffdbf5a756db03603 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 21 Jan 2025 12:14:05 -0800 Subject: [PATCH] add event-driven once keypress actions, split S and V ephemeral overrides, all mesh split at specified value --- src/main/mesh.js | 17 +++++++++++++++++ src/mesh/split.js | 42 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/main/mesh.js b/src/main/mesh.js index 678abcd3..1db7396e 100644 --- a/src/main/mesh.js +++ b/src/main/mesh.js @@ -280,6 +280,11 @@ function space_init(data) { }, 'keydown', evt => { let { shiftKey, metaKey, ctrlKey, code } = evt; + let once = keyOnce[code]; + if (once) { + delete keyOnce[code]; + return once(evt); + } let rv = (Math.PI / 12); if (api.modal.showing) { if (code === 'Escape') { @@ -598,6 +603,16 @@ function space_load(data) { } let metaCache = {}; +let keyOnce = {}; + +function key_once(data) { + const { code, fn } = data; + keyOnce[code] = fn; +} + +function key_once_cancel(code) { + delete keyOnce[code]; +} function store_meta() { mesh.db.admin.put("meta", metaCache); @@ -711,6 +726,8 @@ function set_snap_value(snap) { // bind functions to topics broker.listeners({ + key_once, + key_once_cancel, load_files, object_meta, object_destroy, diff --git a/src/mesh/split.js b/src/mesh/split.js index 9de2e1d6..065e27bc 100644 --- a/src/mesh/split.js +++ b/src/mesh/split.js @@ -9,15 +9,19 @@ "use strict"; // dep: moto.space +// dep: moto.broker gapp.register("mesh.split", [], (root, exports) => { +const { broker } = gapp; const { Mesh, MeshPhongMaterial, PlaneGeometry, DoubleSide, Vector3 } = THREE; const { mesh, moto } = root; const { space } = moto; -const { api } = mesh; let isActive; +const key_once = broker.bind('key_once'); +const key_cancel = broker.bind('key_once_cancel'); + // split functions let split = { active() { @@ -29,6 +33,11 @@ let split = { return; } let { api, util } = mesh; + let { log } = api; + if (api.selection.models().length === 0) { + log.emit('no models selected for splitting'); + return; + } // create split plane visual let geo, mat, obj = new Mesh( geo = new PlaneGeometry(1,1), @@ -72,11 +81,36 @@ let split = { obj.position.set(mid.x, y, -mid.y); }); isActive = true; + key_once({ code: 'KeyS', fn(evt) { + split.select(); + }}); + key_once({ code: 'KeyV', fn(evt) { + evt.preventDefault(); + let state = split.state; + split.end(); + function doit(z) { + state.plane = { z }; + split.select(state); + } + api.modal.dialog({ + title: "split object Z", + body: [ h.div({ class: "additem" }, [ + h.label('Z value'), + h.input({ value: 0, size: 5, id: "_value" }), + h.button({ _: "split", onclick() { + const { _value } = api.modal.bound; + doit(parseFloat(_value.value)); + api.modal.hide(); + } }) + ]) ] + }); + api.modal.bound._value.focus(); + } }); }, - select() { + select(state) { let { log } = mesh.api; - let { models, plane } = split.state; + let { models, plane } = split.state || state; if (!(models && plane)) { return split.end(); } @@ -92,6 +126,8 @@ let split = { if (!isActive) { return; } + key_cancel('KeyS'); + key_cancel('KeyV'); let space = moto.space; let { obj } = split.state; space.scene.remove(obj);