feat: fold playlist to avoid displaying too many items
This commit is contained in:
parent
b2e5efec93
commit
732c698408
25
interface.py
25
interface.py
@ -165,10 +165,23 @@ def playlist():
|
|||||||
if len(var.playlist) == 0:
|
if len(var.playlist) == 0:
|
||||||
return ('', 204)
|
return ('', 204)
|
||||||
|
|
||||||
|
DEFAULT_DISPLAY_COUNT = 11
|
||||||
|
_from = 0
|
||||||
|
_to = 10
|
||||||
|
|
||||||
|
if 'range_from' in request.args and 'range_to' in request.args:
|
||||||
|
_from = int(request.args['range_from'])
|
||||||
|
_to = int(request.args['range_to'])
|
||||||
|
else:
|
||||||
|
if var.playlist.current_index - int(DEFAULT_DISPLAY_COUNT/2) > 0:
|
||||||
|
_from = var.playlist.current_index - int(DEFAULT_DISPLAY_COUNT/2)
|
||||||
|
_to = _from - 1 + DEFAULT_DISPLAY_COUNT
|
||||||
|
|
||||||
|
|
||||||
tags_color_lookup = build_tags_color_lookup() # TODO: cached this?
|
tags_color_lookup = build_tags_color_lookup() # TODO: cached this?
|
||||||
items = []
|
items = []
|
||||||
|
|
||||||
for index, item_wrapper in enumerate(var.playlist):
|
for index, item_wrapper in enumerate(var.playlist[_from: _to + 1]):
|
||||||
tag_tuples = []
|
tag_tuples = []
|
||||||
for tag in item_wrapper.item().tags:
|
for tag in item_wrapper.item().tags:
|
||||||
tag_tuples.append([tag, tags_color_lookup[tag]])
|
tag_tuples.append([tag, tags_color_lookup[tag]])
|
||||||
@ -197,7 +210,7 @@ def playlist():
|
|||||||
thumb = "static/image/unknown-album.png"
|
thumb = "static/image/unknown-album.png"
|
||||||
|
|
||||||
items.append({
|
items.append({
|
||||||
'index': index,
|
'index': _from + index,
|
||||||
'id': item.id,
|
'id': item.id,
|
||||||
'type': item.display_type(),
|
'type': item.display_type(),
|
||||||
'path': path,
|
'path': path,
|
||||||
@ -207,7 +220,12 @@ def playlist():
|
|||||||
'tags': tag_tuples,
|
'tags': tag_tuples,
|
||||||
})
|
})
|
||||||
|
|
||||||
return jsonify({'items': items, 'current_index': var.playlist.current_index})
|
return jsonify({
|
||||||
|
'items': items,
|
||||||
|
'current_index': var.playlist.current_index,
|
||||||
|
'length': len(var.playlist),
|
||||||
|
'start_from': _from
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
def status():
|
def status():
|
||||||
@ -581,7 +599,6 @@ def upload():
|
|||||||
def download():
|
def download():
|
||||||
global log
|
global log
|
||||||
|
|
||||||
print('id' in request.args)
|
|
||||||
if 'id' in request.args and request.args['id']:
|
if 'id' in request.args and request.args['id']:
|
||||||
item = dicts_to_items(var.bot,
|
item = dicts_to_items(var.bot,
|
||||||
var.music_db.query_music(
|
var.music_db.query_music(
|
||||||
|
@ -94,6 +94,11 @@
|
|||||||
<img style="margin: auto; width: 35px;" src="static/image/empty_box.svg" />
|
<img style="margin: auto; width: 35px;" src="static/image/empty_box.svg" />
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr id="playlist-expand" class="table-dark" style="display: none;">
|
||||||
|
<td colspan="4" style="text-align:center;">
|
||||||
|
<a class="text-muted" href="javascript:">See items <span class="playlist-expand-item-range"></span> on the playlist.</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr class="playlist-item-template" style="display: none;">
|
<tr class="playlist-item-template" style="display: none;">
|
||||||
<input hidden type="text" class="playlist-item-id" value="" />
|
<input hidden type="text" class="playlist-item-id" value="" />
|
||||||
<th scope="row" class="playlist-item-index"></th>
|
<th scope="row" class="playlist-item-index"></th>
|
||||||
@ -473,10 +478,14 @@
|
|||||||
var playlist_loading = $("#playlist-loading");
|
var playlist_loading = $("#playlist-loading");
|
||||||
var playlist_table = $("#playlist-table");
|
var playlist_table = $("#playlist-table");
|
||||||
var playlist_empty = $("#playlist-empty");
|
var playlist_empty = $("#playlist-empty");
|
||||||
|
var playlist_expand = $("#playlist-expand");
|
||||||
|
|
||||||
var playlist_ver = 0;
|
var playlist_ver = 0;
|
||||||
var playlist_current_index = 0;
|
var playlist_current_index = 0;
|
||||||
|
|
||||||
|
var playlist_range_from = 0;
|
||||||
|
var playlist_range_to = 0;
|
||||||
|
|
||||||
function request(_url, _data, refresh=false){
|
function request(_url, _data, refresh=false){
|
||||||
console.log(_data);
|
console.log(_data);
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@ -541,14 +550,37 @@
|
|||||||
playlist_loading.hide();
|
playlist_loading.hide();
|
||||||
$(".playlist-item").remove();
|
$(".playlist-item").remove();
|
||||||
var items = data.items;
|
var items = data.items;
|
||||||
|
var length = data.length;
|
||||||
|
var start_from = data.start_from;
|
||||||
|
playlist_range_from = start_from;
|
||||||
|
playlist_range_to = start_from + length - 1;
|
||||||
|
|
||||||
|
if(items.length < length && start_from > 0) {
|
||||||
|
_from = start_from - 5;
|
||||||
|
_from = _from > 0 ? _from : 0;
|
||||||
|
_to = start_from - 1;
|
||||||
|
if(_to > 0) {
|
||||||
|
insertExpandPrompt(_from, start_from + length - 1, _from, _to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
items.forEach(
|
items.forEach(
|
||||||
function (item) {
|
function (item) {
|
||||||
addPlaylistItem(item);
|
addPlaylistItem(item);
|
||||||
bindPlaylistEvent();
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if(items.length < length && start_from + items.length < length) {
|
||||||
|
_from = start_from + items.length;
|
||||||
|
_to = start_from + items.length - 1 + 10;
|
||||||
|
_to = _to < length - 1 ? _to : length - 1;
|
||||||
|
if(start_from + items.length < _to) {
|
||||||
|
insertExpandPrompt(start_from, _to, _from, _to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
displayActiveItem(data.current_index);
|
displayActiveItem(data.current_index);
|
||||||
|
bindPlaylistEvent();
|
||||||
playlist_table.animate({opacity: 1}, 200);
|
playlist_table.animate({opacity: 1}, 200);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -558,14 +590,40 @@
|
|||||||
$("#playlist-item-"+current_index).addClass("table-active");
|
$("#playlist-item-"+current_index).addClass("table-active");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function insertExpandPrompt(real_from, real_to ,display_from, display_to){
|
||||||
|
var expand_copy = playlist_expand.clone();
|
||||||
|
if(display_from !== display_to){
|
||||||
|
expand_copy.find(".playlist-expand-item-range").html((display_from+1) + "~" + (display_to+1));
|
||||||
|
}else{
|
||||||
|
expand_copy.find(".playlist-expand-item-range").html(display_from);
|
||||||
|
}
|
||||||
|
|
||||||
|
expand_copy.addClass('playlist-item');
|
||||||
|
expand_copy.appendTo(playlist_table);
|
||||||
|
expand_copy.click(function(){
|
||||||
|
updatePlaylist();
|
||||||
|
playlist_range_from = real_from;
|
||||||
|
playlist_range_to = real_to;
|
||||||
|
});
|
||||||
|
expand_copy.show();
|
||||||
|
}
|
||||||
|
|
||||||
function updatePlaylist(){
|
function updatePlaylist(){
|
||||||
playlist_table.animate({opacity: 0}, 200, function(){
|
playlist_table.animate({opacity: 0}, 200, function(){
|
||||||
playlist_empty.hide();
|
playlist_empty.hide();
|
||||||
playlist_loading.show();
|
playlist_loading.show();
|
||||||
$("#playlist-table .playlist-item").css("opacity", 0);
|
$("#playlist-table .playlist-item").css("opacity", 0);
|
||||||
|
data = {};
|
||||||
|
if(!(playlist_range_from === 0 && playlist_range_to === 0)) {
|
||||||
|
data = {
|
||||||
|
range_from: playlist_range_from,
|
||||||
|
range_to: playlist_range_to
|
||||||
|
};
|
||||||
|
}
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
url: 'playlist',
|
url: 'playlist',
|
||||||
|
data: data,
|
||||||
statusCode : {
|
statusCode : {
|
||||||
200: displayPlaylist,
|
200: displayPlaylist,
|
||||||
204: function(){
|
204: function(){
|
||||||
@ -587,11 +645,19 @@
|
|||||||
200 : function(data){
|
200 : function(data){
|
||||||
if(data.ver !== playlist_ver){
|
if(data.ver !== playlist_ver){
|
||||||
playlist_ver = data.ver;
|
playlist_ver = data.ver;
|
||||||
|
playlist_range_from = 0;
|
||||||
|
playlist_range_to = 0;
|
||||||
updatePlaylist();
|
updatePlaylist();
|
||||||
}
|
}
|
||||||
if(data.current_index !== playlist_current_index){
|
if(data.current_index !== playlist_current_index){
|
||||||
playlist_current_index = data.current_index;
|
if(data.current_index > playlist_range_to || data.current_index < playlist_range_from){
|
||||||
displayActiveItem(data.current_index);
|
playlist_range_from = 0;
|
||||||
|
playlist_range_to = 0;
|
||||||
|
updatePlaylist();
|
||||||
|
}else{
|
||||||
|
playlist_current_index = data.current_index;
|
||||||
|
displayActiveItem(data.current_index);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
updateControls(data.empty, data.play, data.mode);
|
updateControls(data.empty, data.play, data.mode);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user