diff --git a/common/lkt.js b/common/lkt.js index 903ced8456d558956af9aa1f47ed6cb005f72169..8cb7da43a606b483fc589394646e107a876428eb 100644 --- a/common/lkt.js +++ b/common/lkt.js @@ -143,46 +143,41 @@ class LktClient { } return __getResult(client); } - - static idleActualisation() - { + static idleActualisation() { var client = new this(); client.m_socket.setTimeout(0); function __getResult(client) { - return new Promise((resolve,reject) => { - client.m_socket.on('data',data => { - if(String(data).includes("playlist")) { + return new Promise((resolve, reject) => { + client.m_socket.on('data', data => { + if (String(data).includes('playlist')) { LktClient.setQueueUpdated(true); } client.m_socket.write(`idle\n`); return null; }); }); - } return __getResult(client); } static commandPlay() { - var status= LktClient.commandStatus(); - return status.then(LktClient.changePlayStatus,LktClient.errorStatus); - } - static changePlayStatus(status) - { - switch(status.state) - { - case "play": - return LktClient.__execSimple("pause 1"); + var status = LktClient.commandStatus(); + return status.then(LktClient.changePlayStatus, LktClient.errorStatus); + } + static changePlayStatus(status) { + switch (status.state) { + case 'play': + return LktClient.__execSimple('pause 1'); break; - case "pause": - return LktClient.__execSimple("pause 0"); + case 'pause': + return LktClient.__execSimple('pause 0'); break; - case "stop": - return LktClient.__execSimple("play"); + case 'stop': + return LktClient.__execSimple('play'); break; default: - logger.info("Unknown play state"+status.state); + logger.info('Unknown play state' + status.state); } } static commandStop() { @@ -198,9 +193,14 @@ class LktClient { static commandShuffle() { return LktClient.__execSimple('shuffle'); } - static commandClear(){ + static commandClear() { return LktClient.__execSimple('clear'); } + static commandMove(from, to) { + var request = 'move ' + from + ' ' + to; + logger.info(request); + return LktClient.__execSimple('move ' + from + ' ' + to); + } static commandQueueAddId(id) { return LktClient.__execSimple(`add id ${id}`); @@ -208,9 +208,8 @@ class LktClient { static commandQueueDelId(id) { return LktClient.__execSimple(`deleteid ${id}`); } - static errorStatus(error) - { - logger.error("Unable to access lektor status:" + error); + static errorStatus(error) { + logger.error('Unable to access lektor status:' + error); } static queue_updated = false; @@ -238,7 +237,6 @@ function __mpdStatusToBool(string) { string = string.split('\n'); string = string[string.length - 1]; return string.split(/ /) == 'OK' ? true : false; - } module.exports = LktClient; diff --git a/instance/main.js b/instance/main.js index bf1f6b234724d12f962bf941953246c05e68b706..d3ad286e63497bb04fdf2be063c7d2571c12b90b 100644 --- a/instance/main.js +++ b/instance/main.js @@ -1,6 +1,7 @@ const { ipcRenderer } = require('electron'); const ejs = require('ejs'); const logger = require('../common/logger.js'); +const e = require('express'); /* prettier-ignore */ const buttonList = [ @@ -49,9 +50,8 @@ window.onload = () => { addIpcToButton('reloadQueue', ['reload-queue-request']); addIpcToButton('reloadDb', ['reload-db-request', 'reload-queue-request']); - logger.debug('Window loaded'); - setTimeout(()=>ipcRenderer.send('reload-queue-request'),500); - setInterval(()=>ipcRenderer.send('verify-queue-reloaded-request'),1000); + setTimeout(() => ipcRenderer.send('reload-queue-request'), 500); + setInterval(() => ipcRenderer.send('verify-queue-reloaded-request'), 50); logger.debug('instance', 'Window loaded'); $('#filterInput').on('keypress', e => { @@ -140,6 +140,7 @@ ipcRenderer.on('reload-db-responce', (event, arg) => { } ); }); + [].forEach.call(document.querySelectorAll('#panelLeft .karaCard'), a); }); /* Create the right panel: the queue */ @@ -158,6 +159,85 @@ ipcRenderer.on('reload-queue-responce', (event, arg) => { } ); }); + logger.info('Time', new Date().getTime() - time); + [].forEach.call( + document.querySelectorAll('#panelRight .karaCard'), + addQueueDragAndDropHandlers + ); +}); + +ipcRenderer.on('queue-moved-responce', (event, arg) => { + logger.info('Time', new Date().getTime() - time); + ipcRenderer.send('reload-queue-request'); }); +var isDnDFromDB = false; +var date = new Date(); +var time = 0; + +function addDBDragAndDropHandlers(element) { + isDnDFromDB = true; +} + +function addQueueDragAndDropHandlers(element) { + element.addEventListener('dragstart', onDragStart, false); + element.addEventListener('dragenter', onDragEnter, false); + element.addEventListener('dragover', onDragOver, false); + element.addEventListener('dragleave', ondragLeave, false); + element.addEventListener('drop', onDrop, false); + element.addEventListener('dragend', onDragEnd, false); +} + +var dragCounter = 0; +var leavedElement; + +function onDragStart(event) { + event.dataTransfer.effectAllowed = 'move'; + event.currentTarget.style.opacity = 0.4; + //logger.debug(event.currentTarget.childElementCount+"\n"); + event.dataTransfer.setData( + 'text/plain', + event.currentTarget.getElementsByClassName('karaPosition')[0].innerText + ); +} + +function onDragEnter(event) { + if (leavedElement != event.currentTarget) { + leavedElement.style.borderTop = ''; + } + event.currentTarget.style.borderTop = '3px solid grey'; + dragCounter++; +} + +function onDragOver(event) { + if (event.preventDefault) { + event.preventDefault(); + } + event.dataTransfer.dropEffect = 'move'; +} + +function ondragLeave(event) { + dragCounter--; + leavedElement = event.currentTarget; + if (dragCounter == 0) { + event.currentTarget.style.borderTop = ''; + } + //logger.debug("dragCount", dragCounter) +} + +function onDrop(event) { + //logger.debug("salut", "salut"); + event.currentTarget.style.borderTop = ''; + time = new Date().getTime(); + ipcRenderer.send('queue-moved-kara', { + from: event.dataTransfer.getData('text/plain'), + to: event.currentTarget.getElementsByClassName('karaPosition')[0] + .innerText, + }); + return false; +} +function onDragEnd(event) { + event.currentTarget.style.opacity = 1; + dragCounter = 0; +} diff --git a/instance/views/karaListItem.ejs b/instance/views/karaListItem.ejs index 0d3c1ec9ffe25c3d1ffd87942eae179c68b40b24..85bced1fe389e84d3d39aaba867fef894013c1f6 100644 --- a/instance/views/karaListItem.ejs +++ b/instance/views/karaListItem.ejs @@ -1,12 +1,13 @@ <%# vim: ts=4 syntax=html The template for the kara card in lists %> -<li class="card p-2 bd-highlight shadow-none d-flex flex-row bd-highlight mb-3 karaCard"> +<li class="card p-2 bd-highlight shadow-none d-flex flex-row bd-highlight mb-3 karaCard" draggable="true"> + <span hidden class = "karaID"><%= kara.id %></span> <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b><%= kara.language %></b></span> <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b><%= kara.cat %></b></span> <span class="karaElement text-uppercase p-2 bd-highlight badge badge-light"><b><%= kara.type %></b></span> <span class="karaElement p-2 bd-highlight mr-auto"><b><%= kara.source %><br> <%= kara.title %></b> <i>[<%= kara.author %>]</i></span> <% if (kara.hasOwnProperty('position')) { %> - <span class="karaElement p-3 bd-highlight"><b><%= kara.position %></b></span> + <span class="karaElement p-3 bd-highlight karaPosition"><b><%= kara.position %></b></span> <% } %> <div class="karaElement p-2 bd-highlight"> <div class="d-flex flex-row bd-highlight mb-3 btn-group karaActionBtnGroup" role="group"> diff --git a/main.js b/main.js index bd76f2a561ff6c7d0bdb1474713a2fbd830ff18d..56ff2da3921ff53eb4484591f5f292b5fd8d4b56 100644 --- a/main.js +++ b/main.js @@ -144,7 +144,9 @@ app.on('ready', () => { } }); }); - setTimeout(() => {lkt.idleActualisation();},500); + setTimeout(() => { + lkt.idleActualisation(); + }, 500); lektor.on('close', code => { logger.warn('main', `Lektor exited with code ${code}`); lektor_closed = true; @@ -205,10 +207,19 @@ ipcMain.on('reload-queue-request', (event, arg) => { }); ipcMain.on('verify-queue-reloaded-request', (event, arg) => { - if(lkt.isQueueUpdated()) { + if (lkt.isQueueUpdated()) { lkt.setQueueUpdated(false); myDb.queue(0, 100).then(karas => { event.reply('reload-queue-responce', karas); }); } }); + +ipcMain.on('queue-moved-kara', (event, movement) => { + logger.debug('bonjour', 'bonjour'); + if (movement.to != movement.from) { + lkt.commandMove(movement.from, movement.to).then(arg => { + event.reply('queue-moved-responce'); + }); + } +});