From 8c2137907018ca0ae441a1d0e12b736cc3542d2d Mon Sep 17 00:00:00 2001 From: Mark Hassman Date: Wed, 28 Jul 2010 13:08:53 -0400 Subject: [PATCH] http-interface: - changed logic so playlist is only downloaded initially and on modification of playlist no longer re-downloads playlist on each item change (this was causing significant delays (>10sec) in the http service with large playlists).. now, the playlist UI is updated locally based on information returned from status.xml Signed-off-by: Ilkka Ollakka --- share/http/js/functions.js | 88 +++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 7 deletions(-) diff --git a/share/http/js/functions.js b/share/http/js/functions.js index f259542987..9ecce150de 100644 --- a/share/http/js/functions.js +++ b/share/http/js/functions.js @@ -279,6 +279,14 @@ function clear_children( elt ) while( elt.hasChildNodes() ) elt.removeChild( elt.firstChild ); } +function playlist_populated() +{ + if( document.getElementById( 'playtree' ) != null && document.getElementById( 'playtree' ).childElementCount > 0 ) + { + return true; + } + return false; +} /********************************************************************** * Interface actions @@ -332,22 +340,22 @@ function pl_previous() function pl_delete( id ) { loadXMLDoc( 'requests/status.xml?command=pl_delete&id='+id, parse_status ); - setTimeout( 'update_playlist()', 1000 ); + setTimeout( 'update_playlist(true)', 1000 ); } function pl_empty() { loadXMLDoc( 'requests/status.xml?command=pl_empty', parse_status ); - setTimeout( 'update_playlist()', 1000 ); + setTimeout( 'update_playlist(true)', 1000 ); } function pl_sort( sort, order ) { loadXMLDoc( 'requests/status.xml?command=pl_sort&id='+order+'&val='+sort, parse_status ); - setTimeout( 'update_playlist()', 1000 ); + setTimeout( 'update_playlist(true)', 1000 ); } function pl_shuffle() { loadXMLDoc( 'requests/status.xml?command=pl_random', parse_status ); - setTimeout( 'update_playlist()', 1000 ); + setTimeout( 'update_playlist(true)', 1000 ); } function pl_loop() { @@ -395,9 +403,16 @@ function update_status() loadXMLDoc( 'requests/status.xml', parse_status ); } } -function update_playlist() +function update_playlist(force_refresh) { - loadXMLDoc( 'requests/playlist.xml', parse_playlist ); + if( force_refresh || !playlist_populated() ) + { + loadXMLDoc( 'requests/playlist.xml', parse_playlist ); + } + else + { + loadXMLDoc( 'requests/status.xml', update_playlist_view ); + } } /********************************************************************** @@ -598,7 +613,7 @@ function parse_playlist() var nowplaying = document.getElementById( 'nowplaying' ); clear_children( nowplaying ); nowplaying.appendChild( document.createTextNode( elt.getAttribute( 'name' ) ) ); - pl.appendChild( document.createTextNode( '* ')); + pl.appendChild( document.createTextNode( '' )); pl_cur_id = elt.getAttribute( 'id' ); } pl.setAttribute( 'title', elt.getAttribute( 'uri' )); @@ -704,6 +719,65 @@ function parse_browse_dir( ) } } +/* updates playlist to display active entry */ +function update_playlist_view () +{ + if( req.readyState == 4 ) { + if( req.status == 200 ) { + var status = req.responseXML.documentElement; + var title = status.getElementsByTagName( 'title' ); + if( title.length > 0 ) { + title = title[0].firstChild.data; + + //update now-playing.. + var nowplaying = document.getElementById( 'nowplaying' ); + clear_children( nowplaying ); + nowplaying.appendChild( document.createTextNode( title ) ); + + //update playlist.. + var playtree = document.getElementById( 'playtree' ); + if( playtree.hasChildNodes() ) + { + var root = playtree.firstChild; //root div + if( root.hasChildNodes() ) + { + for( var i = 0; i < root.childNodes.length - 1; i++ ) + { + if ( root.childNodes[i].className == "pl_node" && root.childNodes[i].hasChildNodes() ) + { + var node = root.childNodes[i]; //pl_node + if( node.className == "pl_node" && node.hasChildNodes() ) + { + for( var j = 0; j < node.childNodes.length - 1; j++ ) + { + if( node.childNodes[j].className == "pl_leaf" ) + { + var leaf = node.childNodes[j]; //pl_leaf + var pl_title = leaf.textContent.substring( 0, leaf.textContent.length - leaf.text.length ) + //if( leaf.style.fontWeight == "bold" && pl_title.substring(0, 2) == "* " ) //handle leaf currently identified as playing.. + //{ + // pl_title = pl_title.substring(2); + //} + if( pl_title == title ) + { + leaf.style.fontWeight = "bold"; + } + else + { + leaf.style.fontWeight = ""; + } + } + } + } + } + } + } + } + } + } + } +} + /********************************************************************** * Input dialog functions *********************************************************************/ -- 2.39.2