lychee/src/scripts/multiselect.js
Nils Asmussen e41b0f81bd Improved fullscreen enter/leave in photo view.
Previously, document.mouse{enter,leave} was used for that. This
has the disadvantage that is doesn't work when the browser is
in fullscreen mode (at least, in Chromium), because the mouse
can no longer leave the document.

With this commit, mousemove is used to switch to fullscreen
in the photo view after the user has not moved the mouse for
some time. It is left again, if the user moves the mouse.
2016-08-01 14:20:21 +02:00

233 lines
5.4 KiB
JavaScript

/**
* @description Select multiple albums or photos.
* @copyright 2015 by Tobias Reich
*/
multiselect = {}
multiselect.position = {
top : null,
right : null,
bottom : null,
left : null
}
multiselect.bind = function() {
$('.content').on('mousedown', (e) => { if (e.which===1) multiselect.show(e) })
return true
}
multiselect.show = function(e) {
if (lychee.publicMode) return false
if (!visible.albums() && !visible.album()) return false
if ($('.album:hover, .photo:hover').length!==0) return false
if (visible.search()) return false
if (visible.multiselect()) $('#multiselect').remove()
sidebar.setSelectable(false)
multiselect.position.top = e.pageY
multiselect.position.right = -1 * (e.pageX - $(document).width())
multiselect.position.bottom = -1 * (multiselect.position.top - $(window).height())
multiselect.position.left = e.pageX
$('body').append(build.multiselect(multiselect.position.top, multiselect.position.left))
$(document)
.on('mousemove', multiselect.resize)
.on('mouseup', (e) => { if (e.which===1) multiselect.getSelection(e) })
}
multiselect.selectAll = function() {
if (lychee.publicMode) return false
if (visible.search()) return false
if (!visible.albums() && !visible.album) return false
if (visible.multiselect()) $('#multiselect').remove()
sidebar.setSelectable(false)
multiselect.position.top = 70
multiselect.position.right = 40
multiselect.position.bottom = 90
multiselect.position.left = 20
$('body').append(build.multiselect(multiselect.position.top, multiselect.position.left))
let documentSize = {
width : $(document).width(),
height : $(document).height()
}
let newSize = {
width : documentSize.width - multiselect.position.right + 2,
height : documentSize.height - multiselect.position.bottom
}
let e = {
pageX : documentSize.width - (multiselect.position.right / 2),
pageY : documentSize.height - multiselect.position.bottom
}
$('#multiselect').css(newSize)
multiselect.getSelection(e)
}
multiselect.resize = function(e) {
if (multiselect.position.top === null ||
multiselect.position.right === null ||
multiselect.position.bottom === null ||
multiselect.position.left === null) return false
let newSize = {}
let documentSize = {}
// Get the position of the mouse
let mousePos = {
x : e.pageX,
y : e.pageY
}
// Default CSS
let newCSS = {
top : null,
bottom : null,
height : null,
left : null,
right : null,
width : null
}
if (mousePos.y>=multiselect.position.top) {
documentSize.height = $(document).height()
// Do not leave the screen
newSize.height = mousePos.y - multiselect.position.top
if ((multiselect.position.top + newSize.height)>=documentSize.height) {
newSize.height -= (multiselect.position.top + newSize.height) - documentSize.height + 2
}
newCSS.top = multiselect.position.top
newCSS.bottom = 'inherit'
newCSS.height = newSize.height
} else {
newCSS.top = 'inherit'
newCSS.bottom = multiselect.position.bottom
newCSS.height = multiselect.position.top - e.pageY
}
if (mousePos.x>=multiselect.position.left) {
documentSize.width = $(document).width()
// Do not leave the screen
newSize.width = mousePos.x - multiselect.position.left
if ((multiselect.position.left + newSize.width)>=documentSize.width) {
newSize.width -= (multiselect.position.left + newSize.width) - documentSize.width + 2
}
newCSS.right = 'inherit'
newCSS.left = multiselect.position.left
newCSS.width = newSize.width
} else {
newCSS.right = multiselect.position.right
newCSS.left = 'inherit'
newCSS.width = multiselect.position.left - e.pageX
}
// Updated all CSS properties at once
$('#multiselect').css(newCSS)
}
multiselect.stopResize = function() {
if (multiselect.position.top!==null) $(document).off('mousemove mouseup')
}
multiselect.getSize = function() {
if (!visible.multiselect()) return false
let $elem = $('#multiselect')
let offset = $elem.offset()
return {
top : offset.top,
left : offset.left,
width : parseInt($elem.css('width').replace('px', '')),
height : parseInt($elem.css('height').replace('px', ''))
}
}
multiselect.getSelection = function(e) {
let tolerance = 150
let ids = []
let size = multiselect.getSize()
if (visible.contextMenu()) return false
if (!visible.multiselect()) return false
$('.photo, .album').each(function() {
let offset = $(this).offset()
if (offset.top>=(size.top - tolerance) &&
offset.left>=(size.left - tolerance) &&
(offset.top + 206)<=(size.top + size.height + tolerance) &&
(offset.left + 206)<=(size.left + size.width + tolerance)) {
let id = $(this).data('id')
if (id!=='0' && id!==0 && id!=='f' && id!=='s' && id!=='r' && id!=null) {
ids.push(id)
$(this).addClass('active')
}
}
})
if (ids.length!==0 && visible.album()) contextMenu.photoMulti(ids, e)
else if (ids.length!==0 && visible.albums()) contextMenu.albumMulti(ids, e)
else multiselect.close()
}
multiselect.close = function() {
sidebar.setSelectable(true)
multiselect.stopResize()
multiselect.position.top = null
multiselect.position.right = null
multiselect.position.bottom = null
multiselect.position.left = null
lychee.animate('#multiselect', 'fadeOut')
setTimeout(() => $('#multiselect').remove(), 300)
}