diff --git a/index.html b/index.html index 15c6f03..ee432aa 100644 --- a/index.html +++ b/index.html @@ -317,6 +317,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..631c318 --- /dev/null +++ b/js/config.js @@ -0,0 +1,9 @@ +/** + * 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 = { + // Scroll Tick Limit (How much must scroll to reach next tick) + wheelTickSize: 50, +}; 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 fa19b1a..b36a076 100644 --- a/js/ui/tool/dream.js +++ b/js/ui/tool/dream.js @@ -1053,18 +1053,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 + } } };