diff --git a/common/lkt.js b/common/lkt.js index d791194d6f02dc8b13e0d926c239b3d3e35724b2..41806c07ccb0ce86418677ae01437766f21e3c58 100644 --- a/common/lkt.js +++ b/common/lkt.js @@ -313,6 +313,22 @@ class LktClient { static commandQueueDelId(id) { return LktClient.__execSimple(`deleteid ${id}`); } + + static commandPlaylistAddId(playlist, id) { + logger.info("playlist", `playlistadd ${playlist} id://${id}`); + return LktClient.__execSimple(`playlistadd ${playlist} id://${id}`); + } + + static commandPlaylistRemoveId(playlist, id) { + return LktClient.__execSimple(`playlistdelete ${playlist} ${id}`); + } + + static commandPlaylistClear(playlist) { + return LktClient.__execSimple(`playlistclear ${playlist}`); + } + static commandAddPlaylistToQueue(playlist) { + return LktClient.__execSimple(`add playlist://${playlist}`); + } static errorStatus(error) { logger.error('Unable to access lektor status:' + error); diff --git a/instance/main.js b/instance/main.js index aa3788e56064ba447c29253eb91559cf6b0552d9..de97a99f10a5b390be5c2c3cb1695f10631668dd 100644 --- a/instance/main.js +++ b/instance/main.js @@ -4,7 +4,7 @@ const { ipcRenderer, ipcMain } = require('electron'), logger = require('../common/logger.js'), ejs = require('ejs'), e = require('express'); -const { changePlayStatus } = require('../common/lkt.js'); +const { doc } = require('prettier'); /* Global variables */ var countKaraInQueue = 0; @@ -148,6 +148,7 @@ window.onload = () => { configureLeftPanel(); }; var currentPlaylist = ""; +var isInPlaylistTab = false ; /* Create the button list */ function configureLeftPanel() { @@ -160,12 +161,30 @@ function configureLeftPanel() { tabQueue.style.boxShadow = "none"; tabPlaylist.style.outline = "none"; tabPlaylist.style.boxShadow = "none"; + document.getElementById('clearQueue').addEventListener('click', () => { + ipcRenderer.send('clear-queue'); + }); + + document.getElementById('clearPlaylist').addEventListener('click', () => { + if(currentPlaylist != "") { + ipcRenderer.send('clear-current-playlist') + } + }); + document.getElementById('addPlaylistToQueue').addEventListener('click', () => { + if(currentPlaylist != "") { + ipcRenderer.send('add-current-playlist-queue'); + } + }); tabQueue.onclick = () => { tabQueue.style.background = "#4e5d6c"; tabPlaylist.style.background = "#2b3e50"; queuePanel.classList.add("show","active"); playlistPanel.classList.remove("show","active"); + isInPlaylistTab = false; + [].forEach.call(document.querySelectorAll('#panelLeft .karaCard'), setQueueDBView); + document.getElementById("clearQueue").hidden = false; + document.getElementById('clearPlaylist').hidden = true; }; tabPlaylist.onclick = () => { @@ -173,23 +192,38 @@ function configureLeftPanel() { tabQueue.style.background = "#2b3e50"; playlistPanel.classList.add("show","active"); queuePanel.classList.remove("show","active"); - /*if(currentPlaylist != "") { - [].forEach.call(document.querySelectorAll('#panelLeft .KaraCard'), (element) => { - element.getElementsByClassName('karaAddBtn').hidden = true; - element.getElementsByClassName('karaInsertBtn').hidden = true; - element.getElementsByClassName('karaAddPlaylistBtn').hidden = false; - }); - }*/ + isInPlaylistTab = true; + if(currentPlaylist != "") { + [].forEach.call(document.querySelectorAll('#panelLeft .karaCard'), setPlaylistDBView); + } + document.getElementById("clearQueue").hidden = true; + document.getElementById('clearPlaylist').hidden = false; } var playlistSelect = document.getElementById("playlist-selector"); playlistSelect.onchange = () => { currentPlaylist = playlistSelect.value; - // ipcRenderer.send('get-playlist-data',playlistSelect.value); + ipcRenderer.send('get-playlist-data',playlistSelect.value); + if(isInPlaylistTab) { + [].forEach.call(document.querySelectorAll('#panelLeft .karaCard'), setPlaylistDBView); + } + } } +function setPlaylistDBView(element) { + element.getElementsByClassName('karaAddBtn')[0].hidden = true; + element.getElementsByClassName('karaInsertBtn')[0].hidden = true; + element.getElementsByClassName('karaAddPlaylistBtn')[0].hidden = false; +} + +function setQueueDBView(element) { + element.getElementsByClassName('karaAddBtn')[0].hidden = false; + element.getElementsByClassName('karaInsertBtn')[0].hidden = false; + element.getElementsByClassName('karaAddPlaylistBtn')[0].hidden = true; +} + /* Create the left panel */ ipcRenderer.on('reload-db-responce', (event, arg) => { logger.debug('instance', `Web page got reload-db`); @@ -201,6 +235,9 @@ ipcRenderer.on('reload-db-responce', (event, arg) => { }); }); [].forEach.call(document.querySelectorAll('#panelLeft .karaCard'), addDBKaraEventHandlers); + if(isInPlaylistTab && currentPlaylist != "") { + [].forEach.call(document.querySelectorAll('#panelLeft .karaCard'), setPlaylistDBView); + } }); /* Create the right panel: the queue */ @@ -208,7 +245,6 @@ ipcRenderer.on('reload-queue-responce', (event, arg) => { logger.debug('instance', `Web page got reload-queue`); countKaraInQueue = 0; document.getElementById('queueList').innerHTML = ''; - logger.info("queue",JSON.stringify(arg[0])); arg.forEach(kara => { countKaraInQueue++; ejs.renderFile(__dirname + '/views/karaQueueListItem.ejs', { kara: kara }, (err, data) => { @@ -248,12 +284,20 @@ ipcRenderer.on('playlists-updated', (event, playlists) => { return; } var selector = document.getElementById("playlist-selector") - selector.innerHTML = ''; - if(!selector.value) { + var currentChoice = selector.value; + if(!currentChoice || !playlists.includes(currentChoice)) { selector.innerHTML = '<option selected disabled> Select a playlist</option>' } + else { + selector.innerHTML = '<option disabled> Select a playlist</option>'; + } playlists.forEach(playlist => { - optionHtml = `<option value="${playlist}">${playlist}</option>` + if(playlist == currentChoice) { + optionHtml = `<option selected value="${playlist}">${playlist}</option>`; + } + else { + optionHtml = `<option value="${playlist}">${playlist}</option>`; + } selector.innerHTML = ` ${selector.innerHTML} ${optionHtml} @@ -296,6 +340,12 @@ function addDBKaraEventHandlers(element) { id: element.getElementsByClassName('karaID')[0].innerText, }) ); + element.getElementsByClassName('karaAddPlaylistBtn')[0].addEventListener('click', () => { + ipcRenderer.send('add-kara-playlist-id', { + id: element.getElementsByClassName('karaID')[0].innerText, + }) +} +); } function addQueueKaraEventHandlers(element) { @@ -317,13 +367,13 @@ function addQueueKaraEventHandlers(element) { ); } -/*function addPlayListKaraEventHandlers(element) { +function addPlayListKaraEventHandlers(element) { element.getElementsByClassName('karaDeleteBtn')[0].addEventListener('click', () => { ipcRenderer.send('del-kara-playlist-id', { id:element.getElementsByClassName('karaID')[0].innerText }); }); -}*/ +} function onDragStartDB(event) { isDnDFromDB = true; diff --git a/instance/views/karaDBListItem.ejs b/instance/views/karaDBListItem.ejs index 26b27e84f3824a6e4b8c8dcff467409a13a03d3d..62e8fea1fa7e130bf88a9641a7fa210a14916265 100644 --- a/instance/views/karaDBListItem.ejs +++ b/instance/views/karaDBListItem.ejs @@ -6,6 +6,7 @@ <div class="d-flex flex-row bd-highlight mb-3 btn-group karaActionBtnGroup" role="group"> <button class="btn btn-outline-light karaActionBtn karaAddBtn" title="Add"><i class="fas fa-plus"></i></button> <button class="btn btn-outline-light karaActionBtn karaInsertBtn" title="Insert"><i class="fas fa-level-up-alt"></i></button> + <button hidden class="btn btn-outline-light karaActionBtn karaAddPlaylistBtn" title="Add"><i class="fas fa-plus"></i></button> </div> </div> </li> diff --git a/instance/views/panels.ejs b/instance/views/panels.ejs index 75d0b4f8f2a76c1833378fd8fd668285068210d1..fdfd0f0d16005001aa91447d811169b63cb661ca 100644 --- a/instance/views/panels.ejs +++ b/instance/views/panels.ejs @@ -18,6 +18,9 @@ <li class="nav-item" role="presentation"> <button class="nav-link active" id="playlist-tab" data-toggle="tab" data-bs-target="#playlist" type="button" role="tab" aria-controls="playlist" aria-selected="false">Playlist</button> </li> + <button class="btn playlistActionBtn clearQueueBtn" id="clearQueue" title="Clear Queue"><i class="fas fa-eraser"></i></button> + <button hidden class="btn playlistActionBtn clearPlaylistBtn" id="clearPlaylist" title="Clear Playlist"><i class="fas fa-eraser"></i></button> + <button class="btn playlistActionBtn addPlaylistToQueue" id="addPlaylistToQueue" title="Add playlist to queue"><i class="fas fa-arrow-circle-right"></i></button> <li class="playlistChoice ml-4 mt-1"> <select class="form-control bd-highlight" id="playlist-selector" aria-label="Default select example"> <option selected disabled>Select a playlist</option> @@ -26,6 +29,7 @@ <option value="3">Three</option> </select> </li> + </ul> <div class="tab-content"> <div id="queue-panel" class="tab-pane fade show active pl-0" role="tabpanel" aria-labelledby="queue-tab""> diff --git a/main.js b/main.js index cdc17c26383714ab7b25f6e517dbb7b512f70d94..02088852800f7fab42622b237152b44e40170666 100644 --- a/main.js +++ b/main.js @@ -350,6 +350,11 @@ ipcMain.on('verify-lektord', (event, arg) => { lkt.commandPlaylistsList().then((playlists) => { win.webContents.send('playlists-updated', playlists); }); + if(currentPlaylist != "") { + lkt.commandPlaylistListKaras(currentPlaylist).then((karas) => { + win.webContents.send('playlist-data-responce',karas); + }); + } } }, 50); @@ -389,14 +394,6 @@ ipcMain.on('set-settings', (event, arg) => { config.flush(); }); -ipcMain.on('verify-playlists-reloaded-request',(event,arg) => { - if(lkt.isPlaylistsUpdated()) { - lkt.setPlaylistsUpdated(false); - lkt.commandPlaylistsList().then((playlists) => { - event.reply('playlists-updated', playlists); - }); - } -}); ipcMain.on('get-playlist-data', (event, playlist) => { if(playlist) { @@ -405,4 +402,28 @@ ipcMain.on('get-playlist-data', (event, playlist) => { win.webContents.send('playlist-data-responce',karas); }); } +}); + +ipcMain.on('add-kara-playlist-id', (event,arg) => { + lkt.commandPlaylistAddId(currentPlaylist,arg.id); +}); + +ipcMain.on('del-kara-playlist-id', (event,arg) => { + lkt.commandPlaylistRemoveId(currentPlaylist,arg.id); +}) + +ipcMain.on('clear-queue', (event,arg) => { + lkt.commandClear(); +}); + +ipcMain.on('clear-playlist', (event,arg) => { + if(currentPlaylist != "") { + lkt.commandPlaylistClear(currentPlaylist); + } +}); + +ipcMain.on('add-current-playlist-queue', (event,arg) => { + if(currentPlaylist != "") { + lkt.commandAddPlaylistToQueue(currentPlaylist); + } }); \ No newline at end of file diff --git a/style/css/instance.css b/style/css/instance.css index 3cfff5470285e84a764adecbe5cee5f61b409831..f05ff7ad6c540540649e9175c8cf7c551f5bad46 100644 --- a/style/css/instance.css +++ b/style/css/instance.css @@ -205,4 +205,17 @@ input[type="color"]:focus, min-height: 1em; display: table-cell; vertical-align: middle -} \ No newline at end of file +} + +.playlistActionBtn:hover, +.playlistActionBtn:active, +.playlistActionBtn:focus { + background: none; + border-color: transparent !important; + outline: none !important; + box-shadow: none !important; +} + +.playlistActionBtn:hover { + color:grey; +}