diff --git a/index.html b/index.html index 2957e48..d49bd4c 100644 --- a/index.html +++ b/index.html @@ -320,6 +320,9 @@ src="js/initalize/layers.populate.js" type="text/javascript"> + + + diff --git a/js/config.js b/js/config.js new file mode 100644 index 0000000..6120e78 --- /dev/null +++ b/js/config.js @@ -0,0 +1,12 @@ +/** + * This is a file for static unchanging global configurations. + * + * Do NOT confuse with settings, which are modifiable by either the settings menu, or in the application itself. + */ +const config = makeReadOnly( + { + // Scroll Tick Limit (How much must scroll to reach next tick) + wheelTickSize: 50, + }, + "config" +); diff --git a/js/lib/input.js b/js/lib/input.js index 4a469e3..bf67dfd 100644 --- a/js/lib/input.js +++ b/js/lib/input.js @@ -440,6 +440,12 @@ window.addEventListener( window.addEventListener( "wheel", (evn) => { + // For firefox, we need to read a delta before deltaMode to force a PIXEL deltaMode read. + // If we read deltaMode before a delta read, deltaMode will be LINE. + // ref: https://bugzilla.mozilla.org/show_bug.cgi?id=1392460 + let _discard = evn.deltaY; + _discard = evn.deltaMode; + mouse._contexts.forEach(({name, target, validate}) => { if (!target || (target === evn.target && (!validate || validate(evn)))) { mouse.listen[name].onwheel.emit({ diff --git a/js/ui/tool/dream.js b/js/ui/tool/dream.js index 9327d29..bb3f2dc 100644 --- a/js/ui/tool/dream.js +++ b/js/ui/tool/dream.js @@ -1083,18 +1083,29 @@ const dream_img2img_callback = (bb, resolution, state) => { /** * Generic wheel handler */ +let _dream_wheel_accum = 0; const _dream_onwheel = (evn, state) => { if (!evn.evn.ctrlKey) { - // Seems mouse wheel scroll is very different between different browsers. - // Will use scroll as just an event to go to the next cursor snap position instead. - // - // TODO: Someone that has a smooth scrolling mouse should verify if this works with them. + if (evn.mode !== WheelEvent.DOM_DELTA_PIXEL) { + // We don't really handle non-pixel scrolling + return; + } - const v = state.cursorSize - 128 * (evn.delta / Math.abs(evn.delta)); + // A simple but (I hope) effective fix for mouse wheel behavior + _dream_wheel_accum += evn.delta; - state.cursorSize = state.setCursorSize(v + snap(v, 0, 128)); - state.mousemovecb(evn); + if (Math.abs(_dream_wheel_accum) > config.wheelTickSize) { + // Snap to next or previous position + const v = + state.cursorSize - + 128 * (_dream_wheel_accum / Math.abs(_dream_wheel_accum)); + + state.cursorSize = state.setCursorSize(v + snap(v, 0, 128)); + state.mousemovecb(evn); + + _dream_wheel_accum = 0; // Zero accumulation + } } }; diff --git a/js/ui/tool/select.js b/js/ui/tool/select.js index 5fd2cd5..c62cf14 100644 --- a/js/ui/tool/select.js +++ b/js/ui/tool/select.js @@ -592,11 +592,12 @@ const selectTransformTool = () => for (const item of items) { for (const type of item.types) { if (type.startsWith("image/")) { - item.getType(type).then((blob) => { + item.getType(type).then(async (blob) => { // Converts blob to image const url = window.URL || window.webkitURL; const image = document.createElement("img"); - image.src = url.createObjectURL(file); + image.src = url.createObjectURL(blob); + await image.decode(); tools.stamp.enable({ image, back: tools.selecttransform.enable,