From 6814b73a525cd31862dae32be443f5921b2e2225 Mon Sep 17 00:00:00 2001 From: larsjohnsen Date: Wed, 11 Jan 2017 00:04:26 +0100 Subject: [PATCH] New feature: mediaBrowse by wheel (#3606) --- lib/css/modules/_wheelBrowse.css | 18 ++++++++ lib/css/res.scss | 1 + lib/modules/wheelBrowse.js | 73 ++++++++++++++++++++++++++++++++ locales/locales/en.json | 8 ++++ 4 files changed, 100 insertions(+) create mode 100644 lib/css/modules/_wheelBrowse.css create mode 100644 lib/modules/wheelBrowse.js diff --git a/lib/css/modules/_wheelBrowse.css b/lib/css/modules/_wheelBrowse.css new file mode 100644 index 0000000000..41cb9ba560 --- /dev/null +++ b/lib/css/modules/_wheelBrowse.css @@ -0,0 +1,18 @@ +.res-wheel-media-browse { + position: relative; + width: 30px; + height: 16px; + margin-left: 4px; + border-radius: 5px; + cursor: crosshair; + background-color: rgba(0, 0, 0, 0.24); + overflow: hidden; + + &-gallery { + position: absolute; + width: 50%; + height: 100%; + right: 0; + background-color: rgba(255, 0, 0, 0.24); + } +} diff --git a/lib/css/res.scss b/lib/css/res.scss index b4d9abe5d1..feecde0e05 100644 --- a/lib/css/res.scss +++ b/lib/css/res.scss @@ -40,6 +40,7 @@ @import 'modules/userInfo'; @import 'modules/userTagger'; @import 'modules/voteEnhancements'; +@import 'modules/wheelBrowse'; body.res-console-open { overflow: hidden; diff --git a/lib/modules/wheelBrowse.js b/lib/modules/wheelBrowse.js new file mode 100644 index 0000000000..2ec323324e --- /dev/null +++ b/lib/modules/wheelBrowse.js @@ -0,0 +1,73 @@ +/* @flow */ + +import { $ } from '../vendor'; +import { Module } from '../core/module'; +import * as Floater from './floater'; +import * as KeyboardNav from './keyboardNav'; +import * as SelectedEntry from './selectedEntry'; +import * as SettingsNavigation from './settingsNavigation'; + +export const module: Module<*> = new Module('wheelBrowse'); + +module.moduleName = 'wheelBrowseName'; +module.category = 'browsingCategory'; +module.description = 'wheelBrowseDesc'; +module.include = [ + 'linklist', +]; + +module.go = () => { + const wheelBrowseWidget = $('
') + .click(() => SettingsNavigation.loadSettingsPage(module.moduleID)) + .get(0); + const galleryPart = $('') + .appendTo(wheelBrowseWidget) + .get(0); + + function updateGalleryPart(selected = SelectedEntry.selectedThing(), scrollDirection) { + const expando = selected && selected.getEntryExpando(); + + galleryPart.hidden = !( + expando && + expando.media && + expando.media.classList.contains('res-gallery-slideshow') && + ( + !scrollDirection || + ( // Do not show the gallery scroll widget when at the end of the gallery + !(scrollDirection === 'down' && expando.media.querySelector('[last-piece=true]')) && + !(scrollDirection === 'up' && expando.media.querySelector('[first-piece=true]')) + ) + ) + ); + } + + let isSelectionCause = false; + + function scrollWidget(target, scrollDirection) { + if (target === wheelBrowseWidget) { + isSelectionCause = true; + if (scrollDirection === 'down') KeyboardNav.module.options.moveDown.callback(); + else KeyboardNav.module.options.moveUp.callback(); + isSelectionCause = false; + } else if (target === galleryPart) { + if (scrollDirection === 'down') KeyboardNav.module.options.nextGalleryImage.callback(); + else KeyboardNav.module.options.previousGalleryImage.callback(); + updateGalleryPart(undefined, scrollDirection); + } + } + + SelectedEntry.addListener((selected, unselected, options) => { + // Avoid the floater disappearing when approaching the header, which may happen when using other scrollStyles + if (isSelectionCause) options.scrollStyle = 'top'; + + updateGalleryPart(selected); + }, 'beforeScroll'); + + wheelBrowseWidget.addEventListener('wheel', (e: WheelEvent) => { + e.stopImmediatePropagation(); + e.preventDefault(); + scrollWidget(e.target, e.deltaY > 0 ? 'down' : 'up'); + }); + + Floater.addElement(wheelBrowseWidget); +}; diff --git a/locales/locales/en.json b/locales/locales/en.json index 46c3a717af..a778c1ff66 100644 --- a/locales/locales/en.json +++ b/locales/locales/en.json @@ -1836,6 +1836,14 @@ "message": "Format or show additional information about votes on posts and comments." }, + "wheelBrowseName": { + "message": "Browse by Wheel" + }, + + "wheelBrowseDesc": { + "message": "Browse entries and galleries by scrolling inside the grey floater." + }, + "xPostLinksName": { "message": "X-post Links" },